天梯赛&&HBU训练营——连续因子(易错点分析)

一个正整数 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

这题说实话,刚开始一点思路都没有,想了好多种情况好多种解决办法,感觉太麻烦了,而且还怕超时,静下来想了想
①一个数的因子最大是它开方,即sqrt,这就会省掉不必要的遍历;
②没有让输出所有的因子,只是最长连续因子中的最小连续因子,那么只需遍历过程中统计连续因子的个数,是不是最小的先不说,首先得是最长的,如果是最小的,那么在最长长度的那里,不用>=,用>,这样第一次找到的最大的那个,就一定是最小的(我不知道怎么说的更明白些,看代码长度判断那里会好些。。);
③关于数的分类,这种题,我都会找几个例子,看看主要分为哪几类情况,如果只有一个怎么办,比如2,应该正常输出1 \n 2,不管了,先写个大概,发现输出的1 \n 1,显然不符合,改动maxlen相关的部分代码,换个3,7啥的依旧不行,想到了只有1个的,那就是素数啊,所以再找时,先判断是不是素数;
④关于输出,一定是<temp + maxlen,不是<=,比如,有3个连续的,起始是5,则最终应该是5,6,7,但若=,则为5,6,7,8,所以不加=号。
#include <iostream>
#include <cmath>
using namespace std;

bool isprime(int n){
	//题目中说了n>1
	for(int i = 2;i<=sqrt(n);i++){
		if(n%i==0)
			return false;
	} 
	return true;
}

int main(){
	ios::sync_with_stdio(false);
	int n;
	cin >> n;
	int maxlen = 0;
	int temp,i,j;
	if(isprime(n)){
		cout << 1 << endl << n;
		return 0;
	}
	for(i = 2;i<=sqrt(n);i++){
		if(n%i==0){
			int sum = i;
			for(j = i+1;j<=sqrt(n);j++){
				sum *= j;
				if(n%sum!=0){
					break;
				}
			}
			if(j-i>maxlen){
				maxlen = j - i;
				temp = i;//记录第一个连续的起始 
			}
		}
	}
	cout << maxlen << endl;
	for(i = temp;i<temp+maxlen;i++){
		if(i==temp){
			cout << i;
		}else{
			cout << "*" << i;
		}
	}
	return 0;
}
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页