L1-006 连续因子 (20 分)
一个正整数 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
题解:找出最长连续因子的个数,如果n为素数,则其连续因子长度必为1,因子为其本身。其他情况只需遍历到根号n即可,对于每一个值,如果不是因子则跳过,否则暴力找连续的因子长度。还有就是注意开long long。
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
ll sum, start;//最长连续因子的个数,开始时的因子
int main()
{
ll n;
cin >> n;
for (ll i = 2; i*i <= n; i++)//只需遍历到根号n即可,因为在根号n到n之间没有连续因子,除非为素数为本身
{
if (n%i != 0)//不是因子就不需要判
continue;
ll j = i;
ll t = n; //临时变量代替n,否则n的值会改变
ll num = 0;//临时记录最长连续银子个数
while (t%j == 0)//暴力连续因子
{
t /= j;
num++;
j++;
}
if (sum < num)//更新最优值
{
sum = num;
start = i;
}
}
if (sum == 0)//素数
cout << "1" << endl << n << endl;
else
{
cout << sum << endl;
for (int i = 0; i < sum; i++)
{
if (i == sum - 1)
cout << start + i << endl;
else
cout << start + i<<"*";
}
}
return 0;
}