一个正整数N的因子中可能存在若干连续的数字。例如630可以分解为356*7,其中5、6、7就是3个连续的数字。给定任一正整数N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。
输入格式:
输入在一行中给出一个正整数N(1<N<2^31)。
输出格式:
首先在第1行输出最长连续因子的个数;然后在第2行中按“因子1因子2……*因子k”的格式输出最小的连续因子序列,其中因子按递增顺序输出,1不算在内。
- 思路
使用双重循环外层为因子格式内层为因子起始值
当因子乘积可以整除N即找到
假设连续因子有n个,从m开始
求最长连续因子->n应该从最大的开始
2^31=2147483648
如果有13个因子从1开始,即为13的阶乘 6227020800>2^31
故最多12位 for循环从12开始
输出最小的连续因子->m从最小的2递增值N的开放
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
/*
N<=2^31=2147483648
13的阶乘是 6227020800
所以连续因子最长为12位
*/
/*阶乘要用long long来存*/
/*要求最长所以外层for循环长度递减*/
/*要求最小所以第二层for循环起始数字递增*/
int main()
{
int N;
scanf("%d", &N);
int maxlen = 12;
int start;
int lim = sqrt(N);//因子上限
bool flag = false;//是否存在连续因子
int length;
for (length = maxlen; length >= 1; --length)//注意此处1的情况也要考虑的
//比如1*2*7输出的应该是2而不是7
{
for (start = 2; start <= lim; ++start)
{
int ans = 1;
for (int k = start; k <= start + length - 1; ++k)
{
ans *= k;
}
if (N%ans == 0)
{
flag = true;
break;
}
}
if (flag)
break;//注意这一层也要跳出去
}
if (flag)
{
printf("%d\n", length);
int f = 0;
for (int i = length,k=start; i >= 1; --i,++k)
{
if (f)
printf("%c", '*');
f = 1;
printf("%d", k);
}
}
else
{
//质数才输出它本身
printf("1\n%d", N);
}
system("pause");
return 0;
}