一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。
输入格式:
输入在一行中给出一个正整数 N(1<N<2^31)
输出格式:
首先在第 1 行输出最长连续因子的个数;然后在第 2 行中按 因子1*因子2*……*因子k 的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内。
输入样例:
630
输出样例:
3
5*6*7
法1:暴力枚举每个首因数,“9输出1和3”:
#include <bits/stdc++.h>
#define fro(i, n) for(int i = 0; i < n; i++)
#define ifi if(i) cout << " ";
using namespace std;
typedef long long LL;
const int maxn = 1e4+10;
int main() {
LL n; cin >> n;
LL sqr = sqrt(0.5 + n); // 至根下n
LL L = 0, start = n; // 尽量初始化,随后统一处理
for(LL i = 2; i <= sqr; i++) {
if(n % i) continue; // 不是因数的不处理
LL m = n, j = i, tL = 0;
while(1) {
if(m % j) break;
m /= (j++);
tL++;
}
if(tL > L) { L = tL; start = i; } // 更新Answer
}
if(L == 0) L = 1; // 素数!
cout << L << endl;
for(LL i = start; i < start+L; i++) {
if(i != start) cout << "*";
cout << i;
}
return 0;
}
法二: 暴力枚举长度L
思路:由 n < 2^31
得到 L <= 12
于是:从长到短枚举长度 从小到大枚举因数
框架如下:
Input();
for(L:12~1)
{
for(start:2~sqr)
{
if(ok) break;
}
if(ok) break;
}
Print();
回归首发、、