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



/*************************
题意:
整数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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值