L1-006. 连续因子

一个正整数N的因子中可能存在若干连续的数字。例如630可以分解为3*5*6*7,其中5、6、7就是3个连续的数字。给定任一正整数N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。

输入格式:

输入在一行中给出一个正整数N(1<N<231)。

输出格式:

首先在第1行输出最长连续因子的个数;然后在第2行中按“因子1*因子2*……*因子k”的格式输出最小的连续因子序列,其中因子按递增顺序输出,1不算在内。

输入样例:

630

输出样例:

3
5*6*7

思路:对题意没有理解清楚,所有调试了一会,这个题不是说所有因子,而是能相乘等于N的因子。好比说12这个数,
正确的输出应该是2 2*3,而不是3 2*3*4;然后还得注意极值情况,比如0输出1 0、1输出1 1,2输出1 2等等。
#include<stdio.h>
#include<set>
#include<vector>
#include<functional>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int num; cin >> num;
    vector<int>vec;
    set<int>se;
    vec.push_back(num);
    for (int i = 2; i <= (int)sqrt(num); i++)
    {
        if (num%i == 0){
            if (se.find(i) == se.end()){
                vec.push_back(i);
                se.insert(i);
            }
            if (se.find(num / i) == se.end()){
                vec.push_back(num / i);
                se.insert(num / i);
            }
        }
    }
    
    sort(vec.begin(), vec.end());

    int cnt = 1, max = 1, maxp = 0;
    for (int i = 1; i < vec.size(); i++)
    {
        if (vec.at(i) == vec.at(i - 1) + 1)
            cnt++;
        else cnt = 1;

        if (max < cnt){
            max = cnt;
            maxp = i - max + 1;
        }
    }

    cout << max << endl;
    for (int i = maxp; i < maxp + max; i++)
    {
        if (i == maxp)
            cout << vec[i];
        else cout << "*" << vec[i];
    }
    if (max != 0) cout << endl;
    
    return 0;
}
未AC代码
#include<stdio.h>
#include<set>
#include<vector>
#include<functional>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int num; cin >> num;

    int max = 0, maxp = 0;
    for (int i = 2; i <= (int)sqrt(num); i++)
    {
        for (int j = i, cnt = 1; cnt*j <= num; cnt *= j, j++)
        {
            if (num % (cnt*j) != 0)
                break;
            //cout << cnt << " " << j << endl;
            
            if (max < j - i + 1){
                max = j - i + 1;
                maxp = i;
            }
        }
    }
    
    if (max == 0){
        cout << 1 << endl;
        cout << num << endl;
        return 0;
    }

    cout << max << endl;
    for (int i = maxp; i < max + maxp; i++)
    {
        if (i != maxp)cout << "*";
        cout << i;
    }
    cout << endl;
    return 0;
}

方法来自:https://www.cnblogs.com/zhien-aa/p/5635582.html


posted @ 2018-03-14 22:08  我只有一件白T恤  阅读(200)  评论(0编辑  收藏  举报