如下代码怎么理解那个i<=sqrt(x)呢!
#include<bits/stdc++.h>//万能头文件,拿走不谢。
using namespace std;
bool isprime(int x) {
if(x == 1)
return false;
for(int i = 2; i <= sqrt(x); i++)//是因为不是素数,必然是合数,合数必然是除1和本身之外的两个数相乘。
if(x % i == 0) return false;
return true;
}
int main() {
int n;
cin >> n;
for(int i = 0; i < n; i++) {
int b;
cin >> b;
printf("%s\n", isprime(b) ? "Yes" : "No");
}
return 0;
}
以下我们以16这个数为例,进行如下运算 |
---|
16是一个合数(就是除了自身和1之外还能被其他数整除和素数相对)
16有两个因子相乘得到,这里可以写为因子1和因子2。(如紫色字部分)
画的16=1* 16 = 2 * 8 = 3 * 6 = 4 * 4中下画红线的数是16比较小的因子,就是因子1是始终小于等于根号下16的。
这样做的好处 |
---|
从2开始筛选素数,只要筛选出有因子1能把它整除就能证明它不是素数。这样就节约了很多的计算量,比如>10000的数,你进行一百多次循环就可以判断出它是否是素数了,这样就从10000直接降到了100。
由此可见其中的高效。