PTA-L1-006 连续因子

118 阅读1分钟

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

/*
    求的最小的连续因子序列是所有最长连续因子序列中的第一个,
    好比最长的连续因子序列长度为3,  求出第一个长度为3的连续因子序列,
    可能后面还有长度为3的连续因子序列,但 start 不会更新

*/
include<stdio.h>
#include<stdbool.h>
#include<math.h>

bool is_prime(int x)
{
    int i;
    for( i = 2 ; i<=sqrt(x) ; i++)
    {
        if(x%i==0) return false;
    }
    return true;
}

int main()
{

    long long n;
    scanf("%lld",&n);

    long long i, j;
    long long mul = 1;
    int start = 0, len = 0;

    if(is_prime(n))  printf("1\n%d",n);     //先判断是否素数
    else
    {
        for( i =2 ; i<=sqrt(n) ; i++)
        {
            mul = 1;
            for( j = i; mul*j<=n ; j++)
            {
                mul*=j;
                if(n%mul==0&&j-i+1>len)    //如果j-i+1>len则更新len,如果找出第一个的最长的连续因子序列
                {                          //len就不会更新
                    start = i;
                    len = j-i+1;
                }
            }
        }

        printf("%d\n",len);
        for( i = start ; i<start+len ; i++)
        {
            if(i==start) printf("%lld",i);
            else printf("*%lld",i);
        }


    }

    return 0;
}

详细解释CSDN博主Piink blog.csdn.net/Piink/artic…