整体思路
对于这道题来说,如果要使用或设计一些巧妙的算法还是相当麻烦的,但是其实暴力法的时间复杂度不是特别大,最终结果也是不错的:
暴力求解
通过两个循环嵌套,做数字累乘,再判断是否满足条件:若所得的新串长度比原来的length长并且累乘值sum是数字num的因数,那么久更新长度length和数字串的开始数字start
当然,对于外循环来说,并没有必要从1循环到num,实际上从2到
n
u
m
\sqrt{num}
num 就足矣。
sq = sqrt(num);
for (int i = 2; i <= sq; i++)
{
sum = 1;
for (int j = i; (sum *= j) <= num; j++)
{
if (j-i+1 > length && num % sum == 0)
{
start = i;
length = j-i+1;
}
}
}
完整代码实现
#include <iostream>
#include <cmath>
using namespace std;
int main() {
int start, length;
long long num, sq ,sum;
cin >> num;
sq = sqrt(num);
for (int i = 2; i <= sq; i++)
{
sum = 1;
for (int j = i; (sum *= j) <= num; j++)
{
if (j-i+1 > length && num % sum == 0)
{
start = i;
length = j-i+1;
}
}
}
if (length == 0)
{
start = num;
length = 1;
}
printf("%d\n%d", length, start);
while (--length)
{
printf("*%d", ++start);
}
return 0;
}