您的位置:首页 > 其它

(PAT)L1-006 . 连续因子

2018-02-18 16:38 411 查看

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


初看题没有思路,在网上找到很多解法,此处运用暴力解法(只看了暴力解法……), 时间复杂度那没得说肯定很大啦,但是解决这道题没问题。
思路:首先应该注意到2^31的值为2147483648,13的阶乘为6227020800,13!>2^31,也就是说最多只要12个连续的数相乘(不包括1)就能够达到2^31,题目的要求是找出正整数N的最长连续因子,并输出最小的连续因子序列,也就是说可以在长度为2到12中找到一些相乘的连续因子,看是否可以被N整除,如果能被整除就可以不断地更新这个序列,最终得出正确答案。
方法:得到一个上限值sqrt(N),从2到sqrt(N)依次作为开始值进行寻找,下面代码:

#include <iostream>
#include <cmath>
#include <cstdio>

using namespace std;

typedef long long LL;

int main(){
LL N;
int lim,len,s;
cin>>N;
lim = sqrt(N);
bool flag = false;
for( len = 12 ; len >= 1 ; len-- ){
for( s = 2 ; s <= lim ; s++ ){
LL ans = 1;
for( int k = s ; k <= s+len-1 ; k++ ){
ans *= k;
}
if(N%ans==0){
flag = true;
break;
}
}
if(flag) break;
}

if(flag){
cout<<len<<endl;
for( int i = s ; i <= s+len-1 ; i++ ){
if(i==s){
cout<<i;
}
else{
cout<<"*"<<i;
}
}
}
else{
cout<<"1"<<endl;
cout<<N<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  团体天梯赛