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
这题开始觉得还挺难的,后来看了网上的题解觉得其实也没有什么太大的含量。
首先那个12出来的原因是因为12!(阶乘)足以满足题目的要求,也就是说,不论是多大的数据,连续乘的数字个数都需要小于12,那么我们就从12个数字开始往下逐渐递减。同时,每一次确定连续乘数字个数后,开始计算,我们从2开始,到根号 n 时结束,找到合适的数据即可输出结果了。最后还需要额外注意一下没有的情况即可。
#include<bits/stdc++.h> using namespace std; int main() { int n; cin>>n; int max = sqrt(n); for(int len = 12; len >= 1; len--) {
for(int start = 2; start <= max; start++) {
long long int ans = 1; for(int i = start; i - start <= len - 1; i++) ans *= i;
if(n % ans == 0) { cout<<len<<endl<<start; for(int i = start + 1; i - start <= len - 1; i++) cout<<"*"<<i; return 0;
} } } cout<<1<<endl<<n; return 0; }