7-6 连续因子(20 分) 一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。
输入格式: 输入在一行中给出一个正整数 N(1<N<2^31 )。
输出格式: 首先在第 1 行输出最长连续因子的个数;然后在第 2 行中按 因子1因子2……*因子k 的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内。
输入样例: 630 输出样例: 3 567 / * 12!=479 001 600=23456789101112;连续因子的长度为11; 2^31=2147483648; 13!=6227 020 800=23456789101112*13;连续因子的长度为12; 故12!<2^31<13!;确保考虑周全,取最大长度len=12; 这个数据是我从一位作者那看到的
若start+len没有减一,则会多乘一位;例,当len=11时;(i=2;i<=14;i++ ;)2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10 * 11 * 12 * 13;长度为12,与长度len=11不相等; 故需要减一; 代码如下:
#include<stdio.h>
#include<math.h>
int main()
{
int n,len,i,s;
long long int a;
scanf("%d",&n);
for(len=12;len>=1;len--)
{
for(s=2;s<=sqrt(n);s++)
{
a=1;
for(i=s;i<=s+len-1;i++)
{
a*=i;
}
if(n%a==0){
printf("%d\n%d",len,s);
for(i=s+1;i<=len+s-1;i++)
{
printf("*%d",i);
}
return 0;//此处不能用goto,否则测试点4错误
}
}
}
printf("1\n%d",n);
}