一个正整数 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
代码:
#include <iostream>
#include <cmath>
using namespace std;
int main() {
int n; // 要检查的数字
int start = 0; // 最长序列的起始数字
int maxLen = 0; // 最长序列的长度
int len; // 当前序列的长度
int current; // 当前的除数
int modifiedN; // 被修改后用于计算的n
cin >> n;
// 遍历所有可能的起始数字,这边只能用sqrt 或者 i < n / i, 用i * i < n 会超时
for (int i = 2; i < sqrt(n); i++) {
len = 0;
current = i;
modifiedN = n;
// 检查从i开始的连续整数是否能整除modifiedN
while (modifiedN % current == 0) {
len++;
modifiedN /= current;
current++;
}
// 更新找到的最长序列
if (len > maxLen) {
maxLen = len;
start = i;
}
}
// 如果没有找到任何可以整除n的连续整数序列
if (start == 0) {
start = n; // 序列就是n本身
maxLen = 1; // 长度为1
}
// 输出最长序列的长度
cout << maxLen << endl;
// 输出序列本身
for (int i = start, count = 1; count <= maxLen; i++, count++) {
if (count > 1) cout << "*";
cout << i;
}
}
整活代码:
#include<iostream>
int n,s,l,_,m,j;
int main(){std::cin>>n;for(int i=2;i<n/i;i++)
{l=0,j=i,_=n;while(_%j==0)l++,_/=j++;if(l>m)m=l,s=i;}
if(!s)s=n,m=1;_=1;std::cout<<m<<'\n'<<s;
for(int i=s+1;_<m;i++,_++)std::cout<<"*"<<i;}
标签:20,int,c++,current,modifiedN,因子,006,len,序列
From: https://blog.csdn.net/chq66666/article/details/139372868