L1-006 连续因子
一个正整数 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
说明:
暴力求解法:这道题目的目的是找到一个数的最长连续因子,可以按照求质因数的方法,对该数字求根号后的值进行遍历,并且使用一个值来记录连续数字的初始值与连续数字的长度,最后输出最长的连续数字串。
另外,需要注意的是,当所求的数是质数时,该数字的判断会被sqrt(n),给派出,所以,需要在最后加上质数的判断结果。
代码:
#include<iostream>
#include<cmath>
using namespace std;
int main(){
int N,temp;
int count = 0, maxcount = 0, start = 0;
cin>>N;
for(int i = 0; i <=sqrt(N); i++){
temp = N;
count = 0;
int j = i;
while(temp%j == 0){
temp/=j++;
count ++;
}
if(count > maxcount){
maxcount = count;
start = i;
}
}
if(maxcount){
cout<<maxcount<<endl;
for(int i = 0; i < maxcount; i++){
count << start + i;
if(i != maxcount - 1)
cout<<"*";
}
}
else
cout<<"1"<<endl<<N;
return 0;
}
另附柳大神的思路:使用暴力破解发,一个个尝试,既然是递增连续的因子长度,那么必定是几个不重复的连续数字,按照阶乘的思路,由题目已知n最大是231,这个值介于12与13的阶乘之间,所以,所求的连续因子的最大长度是12,所以,可以从len = 12开始,一直到 len = 1,来找满足题目要求的序列。

浙公网安备 33010602011771号