**
不管是求1到100的素数还是求100到200的素数其实就是 i 的数值变化而已,其他的没有任何差异,我们只要弄清素数的概念以及知道求素数的方法就可以。
###下面我以求100~200的素数为例示范一下过程和主要算法的思想。
**
- 素数就是除了一和本身不能被其他的数整除,比如说,10就可以被2和5整除,那么10就不是素数,11这个数除了1和11之外,就没有其他的数一个除,所以11就是素数。下面我们来具体讲解一下例题,让大家有更深刻的认识。
方案1:
- 第一种就是常规做法,设两个循环变量,i 和 j ,i 变量是遍历100到200之间的数,j 变量是遍历2到 i 变量的数,也可以理解为除数和被除数的关系,注意 j 的范围只遍历到 i 结束。先判断 i % j 余数是否为0,如果能整除就不是素数(例如 10%2==0),跳出循环,直到 j 的值增长到超过 i 了,说明 j 已经遍历了一遍,并且没有找到余数为0 的数,那么这个数就是素数,输出就可以了。
#include<stdio.h>
int main()
{
int i=0,j=0;
for(i=100;i<=200;i++){
for(j=2;j<=i+1;j++){
if(i%j==0){
break;
}
}
if(i==j){
printf("i=%d\n",i);
}
}
return 0;
}
方案2:
- 第二种是对第一种的优化处理,需要用到 sqrt 函数,引入<math.h>头文件,如果一个数可以被1到本身整除,那么就要将2到本身的数遍历一遍,这样做大可不必,因为非素数可以写成除了1和它本身相乘的 a * b 方式,而 a、b 之间必有一个小于等于 a b 之积的开平方根。如果这个非素数能够被 a 整除,则相应的肯定可以被 b 整除。(例如10%2==0,2在根号10之内,所以只要遍历2到根号10就可以)
#include<stdio.h>
#include<math.h>
int main()
{
int i=0,j=0;
for(i=100;i<=200;i++){
for(j=2;j<=sqrt(i);j++){
if(i%j==0)
break;
}
if(j>=sqrt(i)){
printf("i=%d\n",i);
}
}
return 0;
}
方案3:
- 方案3是对方案2的优化,因为每个偶数都不是素数,所以我们只要对奇数进行遍历就好。
#include<stdio.h>
#include<math.h>
int main()
{
int i=0,j=0;
for(i=101;i<=200;i=i+2){
for(j=2;j<=sqrt(i);j++){
if(i%j==0)
break;
}
if(j>=sqrt(i)){
printf("i=%d\n",i);
}
}
return 0;
}
此题仅仅是个人练题时查找资料的随手总结,如果有错误还请批评指正。