#include<stdio.h>
#include<math.h>
int main(void)
{
int N, m;
long long int sum;
scanf("%d", &N);
m = sqrt(N);
for (int i = 11; i >= 1; i--) //i控制因子的个数,即连续相乘的个数
{
for (int j = 2; j <= m ; j++) //j控制从起始因子,从第几个因子开始乘i个因子
{
sum = 1;
for (int k = j; k <= j + i - 1; k++) //相乘各个因子
{
sum *= k;
if (sum > N)
break;
}
if (N % sum == 0) //找到可以整除的连续因子输出
{
printf("%d\n", i);
for (int u = 1;u <= i; u++)
{
printf("%d",j + u - 1);
if (u != i)
printf("*");
}
return 0;
}
}
}
printf("1\n%d", N); //质子输出
}
在解析连续因子时,要注意质数,不然会答案错误。
上述代码使用的是暴力尝试因子的方法。
2的31次方,大概是12的阶乘和13的阶乘之间,所以最大可以是12个数的相乘,1除外,所以是最大11个数相乘。
分析:
根据N的值的取值范围小于等于2的31次方,而这个值介于12的阶乘到13的阶乘之间,所以我们可以得到最大的值应该是12个数连续相乘,又因为1不计算在内,所以最多只要有11为连续因子即可。
采用暴力的思想,我们让他分别从2、3、4…sqrt(N)开始乘,连着乘11位、10位…1位。
即连续乘11位时分别为:
2 3 4 5 6 7 8 9 10 11 12相乘
3 4 5 6 7 8 9 10 11 12 13相乘
…
连续乘10位时分别为:
2 3 4 5 6 7 8 9 10 11相乘
3 4 5 6 7 8 9 10 11 12相乘
…