天梯赛 L1-006 连续因子 (20分)

L1-006 连续因子 (20分)

一个正整数 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

答案1

暴力解法

N<23, 因此N介于12的阶乘和13的阶乘之间,所以我们可以得到的最大的数就是12个连续的数相乘,即12的阶乘。

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>

using namespace std;

int main()
{
    int N;
    scanf("%d", &N);
    int n = sqrt(N);
    int j;
    long long int sum;
    for(int len = 11; len > 0; len--){   //长度从11递减,因为1不算,最多只有11个数相乘
        for(int i = 2; i <= n; i++){     //i > sqrt(N)时,sum
            sum = 1;
            for(j = i; j < len + i; j++){   //共乘len次,j的个数为len个
                sum *= j;
                if(sum > N)        //sum > N时,没有必要继续乘下去
                    break;
            }
            if(N % sum == 0){      
                printf("%d\n%d", len, i);     //sum从i开始乘,一直乘到j
                for(int k = i + 1; k < j; k++)
                    printf("*%d", k);
                printf("\n");
                return 0;
            }       
        }
    }
    printf("1\n%d\n",N);    //当N是质数时,由于1不算在内,故只有一个因子是其本身
    return 0;
}

第一次因少了一个return 0, 导致输出了所有可能位数和结果

第二次提交由于for(int i = 2; i <= n; i++) 写成了for(int i = 2; i < n; i++)有错误答案,未全部通过

第三次提交,发现未考虑质数而有一个测试点未通过

答案2

用了cout cin输入输出,并且利用count记录长度,更改了一下判断方法

#include <iostream>
#include <cmath>
#include <cstdio>

using namespace std;

int main(){
    int N, temp;
    cin >> N;
    int count;
    int maxcount = 0;
    int s = 0;
    for(int i = 2; i <= sqrt(N); i++){
        temp = N;
        count = 0;
        int j = i;
        while(temp % j == 0){
            temp /= j++;
            count++;
        }
        if(count > maxcount){
            maxcount = count;
            s = i;
        }
    }
    if(maxcount){
        cout << maxcount << endl;
        for(int i = 0; i < maxcount; i++){
            cout << s+i;
            if(i != maxcount - 1)
                cout << "*";
        }
    }
    else
        cout << "1" <<endl << N;
    return 0;
}
发布了44 篇原创文章 · 获赞 0 · 访问量 1339

猜你喜欢

转载自blog.csdn.net/qq_41664688/article/details/104133648