计算机算法设计与分析课本(王晓东著)课后算法实现题1-3 最多约数问题

问题描述: 正整数x的约数是能整除x的正整数。正整数x的约数个数记为div(x)。例如,1 2 5 10都是10的约数,且div(10)=4。设a和b是2个正整数,a<=b,找出a和b之间约数个数最多的数x。
算法设计: 对于给定的2个正整数a<=b,计算a和b之间约数个数最多的数。
数据的输入与输出: 输入文件示例 输出文件示例
1 36 9
问题分析: 可以用暴力求解的方法直接求出数的约数的个数,时间复杂度为O(n),随着数的增大时间复杂度也将增大,不合适,这里可以使用约数个数定理,n分解质因数 n=p1^a1 * p2^a2 * p3^a3 pk^ak则n的约数的个数就是(a1+1)(a2+1)(a3+1)…(ak+1),在求解质因数的过程中数字不断减小,时间复杂度为O(logN)

/*****************************************************************
source:算法课本实现题1-3
mean of the title:给定两个正整数,计算两个数之间约数个数最多的数
并输出此数的约数个数
版本2.0:约数个数定理,n分解质因数 n=p1^a1*p2^a2*p3^a3*…*pk^ak
则,n的约数的个数就是(a1+1)(a2+1)(a3+1)…(ak+1)
*****************************************************************/

#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;

int prime_num[10000];//存储质因子的个数 

int isprime(int n){//判断n是否是质因数
	bool flag = true;
	for (int i = 2; i <= sqrt(n); i++){
		if (n%i == 0){
			flag = false;
			break;
		}
	}
	return flag;
}

int solve(int n){//求n的约数个数 
	memset(prime_num, 0, sizeof(prime_num));
	int count = 1;
	int num = n;
	if (num == 1)
		return 1;
	if (isprime(num))
		return 2;
	for (int i = 2; i <= sqrt(num); i++){//分解质因子 
		if (!(n%i)){
			prime_num[i]++;
			n /= i;
			i--;//还原i,质因子可能重复 
		}
	}
	for (int i = 2; i <= num; i++){
		if (prime_num[i]){
			//cout<<"prime_num["<<i<<"]="<<prime_num[i]<<endl;
			count *= (prime_num[i] + 1);
		}
	}
	return count;
}

int main(){
	int a, b;
	int max = 0;
	cout << "Enter two integers a and b:";
	cin >> a >> b;

	for (int i = a; i <= b; i++){
		if (solve(i)>max){
			max = solve(i);
		}
	}
	cout << "The largest number of divisor is " << max << endl;
	return 0;
}

暴力求解的代码

#include<iostream>
#include<cmath>
using namespace std;
int main(){
	int a,b;
	int number,max=0;
	cout<<"Enter two integers a and b:";
	cin>>a>>b;
	
	for(int i=a;i<=b;i++){
		number=0;
		for(int j=1;j<=sqrt(i);j++){
			if(!(i%j)){
				if(j!=(i/j))
					number+=2;
				else
					number+=1;
			}
				
		}
		if(number>max)
			max=number;
	}
	
	cout<<"The largest number of divisor is "<<max<<endl;
	return 0;
}
//时间复杂度为O((b-a)*sqrt(i)),随着b的增大,i增大,时间复杂度增长 

附加
对于约数个数定理证明的一些个人思路
假设n=2^ n1 3^n3,那么n等于n1个2乘以n2个3,然后从n1个2中取一个2,那么从n2个3中就可以取(n2+1)个3和2相乘,每乘一次原数就会多出两个约数,如果从n1个2中取两个2,那么从n2个3中还是可以取(n2+1)个3和2个2相乘,那么原数就又会多出2(n2+1)个约数,那么扩展到n1个2,因为取0个2的时候36从n1个2中一共可以取(n1+1)个2(取0个2时是1和原数相乘),那么原数将一共有2*(n1+1)*(n2+1),因为有重复,所以最后要除以2

书名:算法设计与分析 作者:王晓东 图书目录 第1章 算法引论 1.1 算法与程序 1.2 表达算法的抽象机制 1.3 描述算法 1.4 算法复杂性分析 小结 习 第2章 递归与分治策略 2.1 速归的概念 2.2 分治法的基本思想 2.3 二分搜索技术 2.4 大整的乘法 2.5 Strassen矩阵乘法 2.6 棋盘覆盖 2.7 合并排序 2.8 快速排序 2.9 线性时间选择 2.10 最接近点对问题 2.11 循环赛日程表 小结 习 第3章 动态规划 3.1 矩阵连乘问题 3.2 动态规划算法的基本要素 3.3 最长公共子序列 3.4 凸多边形最优三角剖分 3.5 多边形游戏 3.6 图像压缩 3.7 电路布线 3.8 流水作业调度 3.9 0-1背包问题 3.10 最优二叉搜索树 小结 习 第4章 贪心算法 4.1 活动安排问题 4.2 贪心算法的基本要素 4.2.1 贪心选择性质 4.2.2 最优子结构性质 4.2.3 贪心算法与动态规划算法的差异 4.3 最优装载 4.4 哈夫曼编码 4.4.1 前缀码 4.4.2 构造哈夫曼编码 4.4.3 哈夫曼算法的正确性 4.5 单源最短路径 4.5.1 算法基本思想 4.5.2 算法的正确性和计算复杂性 4.6 最小生成树 4.6.1 最小生成树性质 4 6.2 Prim算法 4.6.3 Kruskal算法 4.7 多机调度问题 4.8 贪心算法的理论基础 4.8.1 拟阵 4.8.2 带权拟阵的贪心算法 4.8.3 任务时间表问题 小结 习 第5章 回溯法 5.1 回溯法的算法框架 5.1.1 问题的解空间 5.1.2 回溯法的基本思想 5.1.3 递归回溯 5.1.4 迭代回溯 5.1.5 子集树与排列树 5.2 装载问题 5.3 批处理作业调度 5.4 符号三角形问题 5.5 n后问题 5.6 0-1背包问题 5.7 最大团问题 5.8 图的m着色问题 5.9 旅行售货员问题 5.10 圆排列问题 5.11 电路板排列问题 5.12 连续邮资问题 5.13 回溯法的效率分析 小结 习 第6章 分支限界法 6.1 分支限界法的基本思想 6.2 单源最短路径问题 6.3 装载问题 6.4 布线问题 6.5 0-1背包问题 6.6 最大团问题 6.7 旅行售货员问题 6.8 电路板排列问题 6.9 批处理作业调度 小结 习 第7章 概率算法 7.1 随机 .2 值概率算法 7.2.1 用随机投点法计算л值 7.2.2 计算定积分 7.2.3 解非线性方程组 7.3 舍伍德算法 7.3.1 线性时间选择算法 7.3.2 跳跃表 7.4 拉斯维加斯算法 7.4.1 n后问题 7.4.2 整因子分解 7.5 蒙特卡罗算法 7.5.1 蒙特卡罗算法的基本思想 7.5.2 主元素问题 7.5.3 素测试 小结 习 第8章 NP完全性理论 8.1 计算模型 8.1.1 随机存取机RAM 8.1.2 随机存取存储程序机RASP 8.1.3 RAM模型的变形与简化 8.1.4 图灵机 8.1.5 图灵机模型与RAM模型的关系 8.1.6 问题变换与计算复杂性归约 8.2 P类与NP类问题 8.2.1 非确定性图灵机 8.2.2 P类与NP类语言 8.2.3 多项式时间验证 8.3 NP完全问题 8.3.1 多项式时间变换 8.3.2 Cook定理 8.4 一些典型的NP完全问题 8.4.1 合取范式的可满足性问题 8.4.2 3元合取范式的可满足性问题 8.4.3 团问题 8.4.4 顶点覆盖问题 8.4.5 子集和问题 8.4.6 哈密顿回路问题
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值