询问一个C++判断素数(除了能被1和本身整除)问题
最近看到一个用C++判断素数(除了能被1和本身整除)的问题例子,不是很懂:
int main(int argc, const char * argv[])
{
int n,i,is_prime=true;
cout<< "Enter a number and press Enter";
cin>>n;
i=2;
while(i<=sqrt(n)){
if(n%i==0)
is_prime=false;
i++;
}
if(is_prime)
cout<<"Number is prime."<<endl;
else{
cout<<"number is not prime."<< endl;
}
system("Pause");
return 0;
}
代码中,
i=2;
while(i<=sqrt(n)){
if(n%i==0)
is_prime=false;
i++;
}
不明白为啥要使用:i<=sqrt(n). 以及为什么要设置i=2 ? 请各位大牛帮忙解答,谢谢!
[解决办法]
因为 0 和 1 肯定不是素数。
还有就是如果一个数能够被一个比它的平方根大的数M整除,那么结果一定是一个比它的平方根小的整数N。
而这个 N 已经 遍历过了。
[解决办法]
先看看数学上素数是怎么求的。
数学是叫我们怎么枚举素数,而程序是叫计算机怎么枚举素数的。
[解决办法]
素数就是除了1和自己,没有其他因子的数,如果该数没有小于等于它的平方根的因子(除了1),则不可能有大于它的平方根的因子; 举个例子,如果a=b * c, 如果 b >= sqrt(a),那么c <= sqrt(a).
这儿用i<=sqrt(n)可以提高性能,少算一些循环。
这儿是找除1和该数自己的因子,当然要从2开始。
[解决办法]
当n能够被i整除时,一个事实一定要知道:这个n一定能够被另一整数k整除----记为k=n/i。这个k的位置是:
1<i<=sqrt(n)<=k<n.
就是说,n能被i整除,就不必求k了。
再换句话说,2到sqrt(n)之间没有i可以整除n,则sqrt(n)到n-1之间也没有k可以整除n。
例子:
n=49
i从2到7,(k从7到48)