题目:
一个正整数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
思路:
刚开始遇到这道题目的时候,根本不懂得他要干什么。630 == 3*5*6*7 还让先输出因子个数,再把因子显示出来。刚开始一直以为因子个数也要加入乘法。后来才慢慢弄明白是输出最小的最长的因子。无论这几个因子相乘的结果是否等于他本身。只要小于等于就行。
代码:
#include <iostream>
#include <math.h>
using namespace std;
long find(long n,long factor,long len){//递归
if(n%factor == 0)
return find(n/factor,factor+1,len+1);
else
return len;
}
int main(){
long n,len = 0;
long factor = 0;
cin>>n;
for(long i=2;i<sqrt(n);i++){
if(n%i==0){//判断这个数i是否能被整除。不能随意进入循环
int l = find(n/i,i+1,1);
if(l>len){
factor = i;
len = l;
}
}
}
if(len == 0){//质数不能进入循环。
cout<<"1"<<endl;
cout<<n<<endl;
return 0;//结束标志
}
cout<<len<<endl;
for(int i=0;i<len;i++){
if(i != len-1)
cout<<factor+i<<"*";
else
cout<<factor+len-1<<endl;
}
return 0;
}