A1096.Consecutive Factors

//题意:求一个数的最大的连续因数个数,例如: 8064 = 2*3*4*6*7*8
//- 最大的连续因子个数为3个:{2,3,4},{6,7,8}。
//- 如果存在相同个数的连续子序列,输出较小的那个。 

//思路分析:如果输入n为素数,那么因数只可能为自己,因为题目说了不包括1。故第一行输出1,第二行输出n。 
//如果一个数为合数,则该数的因数的最大上限为sqrt(n)。
//使用一个二重循环,外层循环枚举i从2到sqrt(n)表示枚举第一个因数。内层循环枚举j从i到sqrt(n)表示所有连续的因数 
//temp为当前所有因数乘积(因数不相同),temp *= j。当(n%temp != 0)时则退出循环,然后看当前
//因子个数j-i是否比Max要大,大则更新当前Max,并将first设置为i。
//第一行输出Max,并从第二行first开始输出Max个连续数字。 
#include <bits/stdc++.h>
using namespace std;

bool isprime(int n) {
	if(n <= 0 || n == 1) return false;
	int sqrn = sqrt(n);
	for(int i = 2;i <= sqrn;i++) 
		if(n % i == 0) return false;
	return true;	
}

int main(void){
	int n;cin>>n;
	if(isprime(n)) 		//如果是素数直接输出1和n 
		cout<<1<<endl<<n;
	else {
		int first = 0,maxn = sqrt(n);	
		int Max = 0;			//最大的连续因子长度 
		for(int i = 2;i <= maxn;i++) {			//遍历第一个可能的因数 
         		int j,temp = 1;
			for(j = i;j <= maxn;j++) {	//遍历所有可能连续的因数 
				temp *= j;
				if(n % temp != 0) break;		 //如果当前的数不是因数 
			}
			if(j - i > Max) {
				Max = j - i;
				first = i;
			}
		}
		cout<<Max<<endl;
		for(int i = 0;i < Max;i++) {
			if(i > 0) cout<<"*";
			cout<<first + i;
		}
	}
	return 0;
}
posted @ 2019-02-08 16:13  Western_Trail  阅读(126)  评论(0编辑  收藏  举报