L1-006 连续因子 (20分)
一个正整数 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
答案1
暴力解法
N<23, 因此N介于12的阶乘和13的阶乘之间,所以我们可以得到的最大的数就是12个连续的数相乘,即12的阶乘。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
int main()
{
int N;
scanf("%d", &N);
int n = sqrt(N);
int j;
long long int sum;
for(int len = 11; len > 0; len--){ //长度从11递减,因为1不算,最多只有11个数相乘
for(int i = 2; i <= n; i++){ //i > sqrt(N)时,sum
sum = 1;
for(j = i; j < len + i; j++){ //共乘len次,j的个数为len个
sum *= j;
if(sum > N) //sum > N时,没有必要继续乘下去
break;
}
if(N % sum == 0){
printf("%d\n%d", len, i); //sum从i开始乘,一直乘到j
for(int k = i + 1; k < j; k++)
printf("*%d", k);
printf("\n");
return 0;
}
}
}
printf("1\n%d\n",N); //当N是质数时,由于1不算在内,故只有一个因子是其本身
return 0;
}
第一次因少了一个return 0, 导致输出了所有可能位数和结果
第二次提交由于for(int i = 2; i <= n; i++) 写成了for(int i = 2; i < n; i++)有错误答案,未全部通过
第三次提交,发现未考虑质数而有一个测试点未通过
答案2
用了cout cin输入输出,并且利用count记录长度,更改了一下判断方法
#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;
int main(){
int N, temp;
cin >> N;
int count;
int maxcount = 0;
int s = 0;
for(int i = 2; i <= sqrt(N); i++){
temp = N;
count = 0;
int j = i;
while(temp % j == 0){
temp /= j++;
count++;
}
if(count > maxcount){
maxcount = count;
s = i;
}
}
if(maxcount){
cout << maxcount << endl;
for(int i = 0; i < maxcount; i++){
cout << s+i;
if(i != maxcount - 1)
cout << "*";
}
}
else
cout << "1" <<endl << N;
return 0;
}