您的位置:首页 > 其它

PAT 1096. Consecutive Factors (20) 最长连续因子乘积 ,素数判断, 连续乘积问题的幂优化

2018-01-24 22:33 561 查看


/*************************
题意:
整数N可以分解为多个因数乘积
每个分解中都有连续的因子部分
求最长连续因子乘积
************************/
/***********************
解题思路:
遍历2到N
如果i是因子
则判断连续乘上i+1,i+2等数字后是否还是N的因子,按此判断
若能够判断出以i为开头的因子乘积长度,统计入maxlen。

优化措施:
1.当得知了maxlen后, 显然,如果i^(maxlen-1) > N 的话,其maxlen+1个连续乘积肯定会比N大,即肯定不存在了
2.如果N是素数,则就是他自身。

注意点:
1.是某个分解中的连续因子乘积,即你求出来的连续因子,必须是某个乘积分解中的
即不仅仅是这个数字可以被整除,而是连续的一段因子乘积都能被整除
*************************/
/***********************
笔记:

*********************/
#include<iostream>
#include<stdio.h>
#include<string>
#include<vector>
#include<queue>
#include<stdlib.h>
#include<algorithm>
#include<string.h>
#include<stack>
#include<map>
#include<set>
#include<unordered_map>
using namespace std;
#define M 100009
#define INF 0x7ffffff

bool jugeprim(int n){
long long num = n;
for(long long i = 2;i * i <= num; i++){
if(num % i == 0)
return false;
}
return true;
}

long long GetPow(int x,int y){
long long ans = 1;
while(y--){
ans *= x;
}
return ans;
}

int main(){
int n, i,j;
cin>>n;
int L, R, len;
int maxlen = 0, ansL, ansR;
i = 2;

if(jugeprim(n)){
printf("1\n%d\n",n);
return 0;
}

int mul;
while(1){
if(GetPow(i,maxlen+1) > (long long)n){
break;
}
if( n % i == 0){
L = i;
R = i + 1;
mul = i;
while(n%(mul*R) == 0){
mul *= R;
R++;
}
len = R - L ;
if(len > maxlen){
maxlen = len;
ansL = L;
ansR = R;
}
i = i + 1 ;
}
else
i++;
}

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