有关素数的基础算法

倖福魔咒の 提交于 2019-11-29 00:56:26

所谓素数,是指恰好有2个约数的整数。因为n的约束都不超过n,所以只要检查2~n-1的所有整数是否整出n就能判定n是不是素数。在此,如果d是n的约数,那么n/d也是n的约数。由n=d×n/d可知min(d,n/d)<=

,所以只要检查2~

的所有整数就够了。同理可知,整数分解和约数枚举都可以在

时间完成,虽然还有更高效的算法(费马测试,

算法,数域筛法等),不过多数情况下这已经足够了。——挑战程序设计竞赛p117

1.素数测试

给定一个整数n,请判断n是不是素数。(1<=n<=10的9次方)

代码:

 #include<iostream> #include<vector> #include<map> #include<algorithm> using namespace std; //假设输入都是正数 //素性测试 bool is_prime(int n) { 	for (int i = 2; i*i <= n; i++) { 		if (n%i == 0) 			return false; 	} 	return n != 1;//1是例外 } //约数枚举 vector<int> divisor(int n) { 	vector<int> res; 	for (int i = 1; i*i <= n; i++) { 		if (n%i == 0) { 			res.push_back(i); 			if (i != n / i) 				res.push_back(n / i); 		} 	} 	return res; } //整数分解,res中值为1的数下标相乘可得n map<int, int> prime_factor(int n) { 	map<int, int> res; 	for (int i = 2; i*i <= n; i++) { 		while (n%i == 0) { 			++res[i]; 			n /= i; 		} 	} 	if (n != 1) 		res[n] = 1; 	return res; }

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!