C++实现 L1-006 连续因子 (20分)
一、描述
L1-006 连续因子 (20分)
一个正整数
N
N
N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 5、6、7 就是 3 个连续的数字。给定任一正整数
N
N
N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。
二、输入格式
输入在一行中给出一个正整数 N ( 1 < N < 2 31 ) N(1<N<2^{31}) N(1<N<231)。
三、输出格式
首先在第 1 行输出最长连续因子的个数;然后在第 2 行中按 因子1* 因子2*……*因子k 的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内。
四、输入样例
630
五、输出样例
3
5*6*7
六、思路
- 判断N为素数还是合数;
- 若为素数则直接输出1和N本身;
- 若为合数,则用暴力破解方法,找到符合要求的式子。
七、小知识点
1、质数判断:
bool isprime(int n)
{
if(n==2)
return true;
for(int i=2;i<=sqrt(n);i++)
{
if(n%i==0)
return false;
}
return true;
}
2、关注暴力破解方法。
八、代码
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
bool isprime(int n);
int main()
{
int n;//给定正整数N
cin>>n;
if(isprime(n))
{
cout<<1<<endl;
cout<<n<<endl;
}
else
{
int length=0;//最大长度
int i;//第一层for循环
int j;//第二层for循环
int zuixiao;//连续数中最小的数
for(i=2;i<=sqrt(n);i++)
{
if(n%i==0)
{
int chengji=i;//乘积
int x;//最小的数
for(j=i+1;j<=sqrt(n);j++)
{
chengji=chengji*j;
if(n%chengji!=0)
break;
}
if(length<j-i)
{
length=j-i;
x=i;
}
zuixiao=x;
}
}
cout<<length<<endl;
for(int a=zuixiao;a<zuixiao+length;a++)
{
if(a!=zuixiao+length-1)
cout<<a<<'*';
else
cout<<a;
}
}
return 0;
}
/*质数判断*/
bool isprime(int n)
{
if(n==2)
return true;
for(int i=2;i<=sqrt(n);i++)
{
if(n%i==0)
return false;
}
return true;
}