一个正整数 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
大致思路:
从输出内容中明白需求 —> 需求分析 —> 最后 先清晰思路再完成代码
这个题目就是输入n,经过处理后,最后需要我们打印出n的最长连续因子个数和最小连续因子序列。
在写题前先弄明白需求:
最长连续因子个数即为在n的所有因子中找出最长的那段连续因子,并且这个连续因子的乘积和也要是n的因子(这个是容易忽视的点,举个例子n=12(它的所有因子有2、3、4、6)2*3*4=24不是12的因子,所以2*3*4并不是12的最长连续因子序列,2*3才是,12的最长连续因子个数就为2)
最小连续因子序列即为在有好几段一样长的连续因子序列中我们取数最小的那段,也可以理解成取乘积和最小的那段。
解题过程:
第一步:输入n
第二步:
(1)用一个数组a装所有因子(注意判断条件用sqrt(n)+1,这里用sqrt(n)会发现n=6不行)
(2)得到的数组a再去通过枚举的方法,判断每一个因子的连续因子序列,取最长的(详细解析见代码)
(3)记录最长连续因子的长度 和 在数组a中连续因子段的第一个数的序列号,方便最后一步打印
第三步:
打印,第一行打印最长连续因子个数,第二行打印最小连续因子序列。
ac代码
#include<iostream>
#include<cmath>
using namespace std;
int main() {
//1.输入
int n;
cin>>n;//输入一个数n
//2.思路
//(1)用一个数组装所有因子(注意判断条件用sqrt(n)+1)
//(2)最长的连续因子的乘积和要是n的因子
//(3)记录最长连续因子的长度 和 在数组中的位置,方便最后一步打印
//2.1 用一个for循环找所有因子
int a[100];//定义一个装因子的数组
int p = 0; //递增数组序号
for(int i = 2; i < sqrt(n)+1; i++) {
if(n%i==0) { //除尽既为因子
a[p++]=i;
}
}
if(p==0) {//解决n为素数的问题,这样写输出的时候就不用单独再写素数的输出情况,不写这个也可以后面打印时再输出中单独加素数的情况(全看个人喜好)测试点6
a[p++]=n;
}
//2.2 判断每一个因子的连续因子序列,最长的连续因子的乘积和要是n的因子
//枚举
int sum = 1;//记录乘积和
int x = 1;//记录因子数(动态)
int max = 1;//记录最长连续因子数
int y = 0;//记录最长连续因子序列在数组a的第一个数序号
for(int i = 0; i < p; i++) {//外循环 每个因子循环去判断
sum = a[i];
x=1;
for(int j = i + 1; j < p; j++) {//内循环
if(a[j] == a[j-1] + 1) {//第一个if条件先判断是否是连续
sum = sum * a[j];
if(n%sum==0) {//第二个if条件判断连续因子的乘积和是否是n的因子
x++;
if(x>max) { //更新最长连续因子数max
max = x;
y=i; //更新最长连续因子序列在数组a的第一个数序号
}
} else {
j = p;//退出内循环
}
} else {
j=p;//退出内循环
}
}
}
//3.输出 最长连续因子个数 和 最长且最小乘积和连续因子序列
cout<<max<<endl;
for(int i = y; i < y+max; i++) {
if(i!=y+max-1) {
cout << a[i] << "*";
} else {
cout << a[i];
}
}
return 0;
}
欢迎各位小伙伴在评论区讨论留言交流哦!