PTA 练习 L1-006 连续因子 (20 分)

L1-006 连续因子 (20 分)

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

输入格式:

输入在一行中给出一个正整数 N(1

输出格式:

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

输入样例:

630

输出样例:

3
5*6*7

 &直接求:从 i = 2 开始枚举第一个乘的数,枚举到根号n,在每一个不同的 i 开始后,每乘一次 j ,就判断一下是不是满足正好是因子,如果是那么需要记录最长的长度,和开始的位置。特判 n 是素数的时候。

#include 
using namespace std;

typedef long long ll;

int main()
{
    ll n, sum, m, Maxlen, b;
    scanf("%lld", &n);
    m = sqrt(n);
    Maxlen = 0;
    b = 0;
    for(int i = 2; i <= m; i ++)
    {
        sum = 1;
        for(int j = i; sum * j <= n; j ++)
        {
            sum *= j;
            if(n % sum == 0 && (j - i + 1) > Maxlen)
            {
                Maxlen = j - i + 1;
                b = i;
            }
        }
    }
    if(b == 0)  //n 是素数
    {
        printf("1\n%lld\n",n);
    }
    else
    {
        printf("%d\n",Maxlen);
        for(int i = b; i < Maxlen + b; i ++)
        {
            if(i == b) printf("%d", i);
            else printf("*%d",i);
        }
        printf("\n");
    }
    return 0;
}

看了其他巨巨的另一种做法:

   #include
    #include
    #include
    #include
    #include
    using namespace std;
    int main()
    {    
         int N;
         scanf("%d",&N);
          int n=sqrt(N);
          int i,j;
            long long int sum;
          for(int len=11;len>=1;len--)//len控制连续因子的个数,由于N范围的限制最多只能到12的阶乘 
             {          
                 for( i=2;i<=n;i++)//连续因子不包括1,从2开始乘,最大乘到N开方就肯定够了 
                 {
                    sum=1;
                    for(  j=i;j<=len-1+i;j++)//从当前的i开始,乘以的个数为len的长度 
                    {
                        sum*=j;
                        if(sum>N)//到这就没有必要往下算了 
                        break;
                    }
                    if(N%sum==0)//当前的sum值是N的一个因子 
                    {
                        printf("%d\n%d",len,i);
                        for(int k=i+1;k

 

你可能感兴趣的:(PTA题)