题目:
一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。
输入格式:
输入在一行中给出一个正整数 N(1<N<2^31)。
输出格式:
首先在第 1 行输出最长连续因子的个数;然后在第 2 行中按 因子1因子2……因子k 的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内。
输入样例:
630
输出样例:
3
56*7
题解
输入的N的上限2^31在12的阶乘到13的阶乘之间,说明N最多是有12个数连乘,题目中不算1,所以连乘因子最多是有11位。解决这个题目,采用暴力的思想。
因为题目中要求“编写最长的连续因子”,所以第一组从11个数相乘开始,先是2开头 2,3,4,5,6,7,8,9,10,11,12这十一个数相乘得到一个结果,然后在是3开头的3,4,5,6,7,8,9,10,11,12,13这十一个数相乘得到一个结果。。。。一直到25(注:这里的25是630开平方根得到的)开头;然后第二组是10个数相乘,第三组是9个数相乘,一直到最后一组1个数相乘。
如果这样顺序执行下来,得到的结果能正好被N整除,就能得到我们要求的数。
代码
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
int main(){
int N;
cin>>N;
int n=sqrt(N);//求平方根;
int i,j;
long long int sum;
for(int len=11;len>=1;len--){//最外层循环
for(i=2;i<=n;i++){//开头数字,2
sum=1;
for( j=i;j<=len-1+i;j++){//2乘到25
sum=sum*j;
if(sum>N) break;
}
if(N%sum==0){//整除
cout<<len<<endl;//因子长度
cout<<i;//5
for(int k=i+1;k<j;k++){//此时的j的值为8
cout<<"*"<<k;
}
cout<<endl;
return 0;//结束,要放到循环外面,循环结束后再结束
}
}
}
cout<<1<<endl;
cout<<N<<endl;
return 0;
}