题目:
![](https://i-blog.csdnimg.cn/blog_migrate/2a17e340a3f1d3b9f20e14be9a6bfe96.png)
![](https://i-blog.csdnimg.cn/blog_migrate/6c538a3ed06d9924f5b801826d570ec4.png)
思路:(看代码前,建议先看思路)
-
写两个循环,一个用来生成起点,另一个用来从起点开始遍历。
2.设置变量记录连续因子的长度。这里最好设置两个变量用来记录,一个是实时记录,另一个用来记录最长的因子长度。
3.设置一个变量用来记录连续因子的一个数字。
注:我的代码中若count1>1记录的是连续因子的倒数第二个数字;count1 == 1记录的是该数字本身;
count1 == 0,说明该数字是素数。
这里再提供几组样例:样例说明看下面链接,尤其是1260这个样例,下面说的很详细。
L1-006 连续因子 (20分)[最详细][包括测试点错误分析]-CSDN博客
输入1:
6
输出1:
2
2*3
输入2:
1260
输出2:
3
3*4*5
代码如下:
#include <stdio.h>
#include <math.h>
int main()
{
int n = 0;
int count = 1,count1 = 0,num = 1;//count,count1用来记录长度,num用来记录数字
scanf("%d",&n);
for(int i = 2;i<=sqrt(n)+1;i++)//设置起点
{
int mul = 1;
for(int j = i;j<=sqrt(n)+1;j++)//从起点开始遍历
{
if(n % j==0)
{
mul*=j;
if(n%(j+1)==0 && n%(mul*(j+1))==0)//保证因子的连续,且连续因子的积也是因子
{
count++;
}
if(count>count1)
{
count1 = count;
num = j;
}
}
else
{
count = 1;
break;
}
}
}
if(count1==0)//该数字为素数,在输出前做一下处理
{
count1 = 1;
num = n;
}
else if(count1>1)//算出起始位置的数字
num = num+2-count1;
printf("%d\n",count1);
for(int i = 0;i<count1;i++)
{
printf("%d",num+i);
if(i<count1-1)
printf("*");
}
printf("\n");
return 0;
}
时隔许久,更新一下代码
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
int main()
{
int n = 0;
scanf("%d",&n);
int res = 0,start = 0;
for(int i = 2;i <= n / i;i++)
{
if(n % i == 0)
{
int cnt = 1,mul = i;
for(int j = i + 1;j <= n / j + 1 && mul < n;j++)
{
if(n % j == 0 && n % (mul * j) == 0)
{
cnt++;
mul *= j;
}
else break;
}
if(cnt > res)
{
start = i;
res = cnt;
}
}
}
if(res == 0) res = 1,start = n;
printf("%d\n",res);
for(int i = start;res--;i++)
printf("%d%c",i,res == 0 ? '\n' : '*');
return 0;
}
代码结果:
![](https://i-blog.csdnimg.cn/blog_migrate/95109b0d8339d6028ce476f1f99196e2.png)
代码结果