L1-006. 连续因子
时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越
一个正整数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
/******************************************** 看到连续的因数,联想到了阶乘的的概念 由于13的阶乘大于2e31,所以连续的长度最大为12 在阶乘中,每个因子都不能大于它的平方根 综上所述,具体做法就是 1。枚举连乘的长度 2。枚举连乘的起点 3。由于起点最大枚举到根号n,枚举不到n本身。所 以需要特殊处理n是质数的情况 ********************************************/ #include<cstdio> #include<iostream> #include<cmath> using namespace std; typedef long long ll; ll n; int main () { scanf("%lld", &n); //对于连续的因子,每个因子不会大于根号n int maxg = ceil( sqrt(n) ); int i, j; //13的阶乘大于2e31,所以连乘长度最大为12 for(i= 12; i>= 1; i--){//枚举连乘长度 //枚举连乘的起点 for(j= 2; j<= maxg; j++){ //计算连乘 ll temp = 1, k = 0; for( ; k< i; k++){ temp = temp * (j + k); //如果连乘结果大于n,则这个长度不可能 if( temp > n ) break; } if( k < i ) break; else if( n % temp == 0 ){//找到最大长度 printf("%d\n%d", i, j); for(k= 1; k< i; k++) printf("*%d", j+k); return 0; } } } //始终没有找到连乘因子,则这个数是质数 printf("%d\n%d", 1, n); return 0; }