《L1-006连续因子》用贪心策略 +√N 遍历,3 行代码找出最长连续因子序列!

这种题型的核心难点在于高效因子分解连续段检测的逻辑处理,需要同时掌握数论和基础算法技巧。在这道题中,我们运用贪心策略(通过双重循环),在因子分解的过程中直接验证连续序列的有效性,避免了存储所有因子的开销。这种设计在保证正确性的前提下,显著提升了效率,尤其适用于大数值的场景。

题目:
《L1-006连续因子》用贪心策略 +√N 遍历,3 行代码找出最长连续因子序列!_第1张图片

输入样例:

630

输出样例:

1
3
2
5*6*7
【算法思路】

本题的目标是找出一个正整数 N 的最长连续因子序列,并输出其长度和该序列。可以采用以下步骤实现:

  1. 确定连续因子的起始位置:从 2 开始遍历到 √N,因为如果连续因子序列的起始数字大于 √N,那么这个序列最多只有一个因子,不可能构成连续因子序列。
  2. 尝试不同长度的连续因子序列:对于每个起始数字 i,不断尝试增加连续因子的长度,计算这些连续因子的乘积 product,并检查 product 是否能整除 N
  3. 记录最长连续因子序列:在遍历过程中,记录最长连续因子序列的长度 maxLength 和起始数字 start
  4. 输出结果:根据记录的 maxLengthstart,输出最长连续因子的个数和最小的连续因子序列。

建议在解题时:

  1. 先进行因数分解,再分析连续序列的可能长度
  2. 枚举时从最小质因数开始,避免重复计算
  3. 注意处理特殊情况(如 n 本身是质数的情况
【代码示例】
#include
#include
using namespace std;
int main(){
	int N;
	cin>>N;
	
	int maxLength = 0;//最长连续因子个数
	int start = 0;//最长连续因子序列的起始数字
	 
	//遍历可能的起始数字
	for(int i=2;i<=sqrt(N);i++){
		int product=1;//可能的因子乘积
		int j;
		//尝试不同长度的连续因子序列 
		for(j=i;;++j){
			product *= j;
			if(N%product != 0) break;
			if(j-i+1 > maxLength){
				maxLength=j-i+1;//更新最长个数
				start=i;//记录当前最长序列开始的长度 
			} 
		}
	} 
	
	//如果没有找到连续因子序列,最长连续因子就是N本身 
	if(maxLength == 0){
		maxLength=1;
		start=N;
	}
	
	//输出结果 
	cout<<maxLength<<endl;
	for(int i=0;i<maxLength;++i){
		if(i>0) cout<<"*";
		cout<<start+i;
	}
	cout<<endl;
	
	return 0;
}

☆贪心策略的具体运用

1. 贪心策略的核心思想

贪心策略指在每一步选择中都采取当前最优的选择,从而期望导致全局最优解。在本题中,贪心策略体现在以下两个关键步骤:

(1)起始点遍历的贪心选择

  • 外层循环从最小的可能起始点 i=2 开始,逐步递增到 sqrt(N)
  • 逻辑:如果存在多个最长连续因子序列,优先找到起始点最小的序列(因为外层循环按升序遍历 i)。

(2)连续序列的贪心延长

  • 内层循环i 开始,尽可能延长连续因子序列的长度。
  • 逻辑:对于每个起始点 i,只要乘积能整除 N,就继续增加序列长度,直到无法整除为止。

你可能感兴趣的:(洛谷,算法,c++,贪心算法)