王道机试练习——求素数

王道机试练习——求素数

题目描述

题目描述: 给定一个数 n,要求判断其是否为素数( 0,1,负数都是非素数)。
输入: 测试数据有多组,每组输入一个数 n。
输出: 对于每组输入 ,若是素数则输出 yes,否则输入 no。
样例输入:
13
样例输出:
yes

求解素数思路

怎样确定一个数是素数?我们可以用所有大于 1 小于其本身的整数去试着 整除该数,若在该区间内存在某个数能整除该数则该数不是素数;若这些数都不 能整除它,则该数为素数。这一朴素的算法思想时间复杂度为 O(n),n 为我们 要测试的数字。但其实,我们并不用测试到 n-1 为止,我们只需测试到不比 sqrt
(( n) 对 n 开根号)大的整数即可,若到这个整数为止,所有正整数数均不能整 除 n,则可以断定, n 为素数。若 n 不存在大于 sqrt(n)的因数时,该做法显然 正确。若我们假设 n 存在大于等于 sqrt(n)的因数 y,则 z = n / y 必同时为 n 的 因数,且其值小于等于 sqrt(n)(否则 z * y > n )。所以,若 n 存在相异于 1 与其 本身的因数且该因数大于 sqrt(n),则必存在小于或等于 sqrt(n)的因数,所以 我们只需测试到 sqrt(n)为止。这样测试一个数是否是素数的复杂度就降低到了 O(sqrt(n))。

代码

#include<iostream>
#include<algorithm>
using namespace std;
bool judge(int x) {//判断一个数是否为素数
	if (x <= 1) return false;
	int bound = (int)sqrt(x) + 1;
	for (int i = 2; i < bound; i++) {
		if (x % i == 0)return false;
	}
	return true;
}
int main() {
	int x;
	while (cin >> x) {
		puts(judge(x) ? "YES" : "NO");
	}
}
发布了12 篇原创文章 · 获赞 12 · 访问量 163

猜你喜欢

转载自blog.csdn.net/xyzxyzxyz1999/article/details/105241517