直接穷举法
这种方法的思路是n分别去整除从2到(n-1)的所有数来判断,若有余数为0,则不是素数,若所有数的余数不为0则是素数。
函数:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int Prime(int num){
if (num <2){
//2是最小的素数所以直接排除更小的
return 0;
}
for (int i = 2; i <num; i++){
if (num%i == 0){
return 0;//能整除的就不是素数
}
}
return 1;// 素数得到
}
求100-200的素数:
int main()
{
int num = 0;
for (num = 100; num <= 200; num++){
//输入100-200的素数
if (Prime(num) == 1){
//函数中return 1的都是素数
printf("%d\n", num);
}
}
system("pause");
return 0;
}
求一个数是不是素数:
int main()
{
int num = 0;
printf("输入一个数判断是否是素数:");
scanf("%d", &num);
int a=Prime(num);
if (a == 1){
printf("是素数");
}
else
printf("不是素数");
system("pause");
return 0;
}
斩半法
仅仅改了for循环的条件,这样就直接减小了一半的计算量。
因为2是最小的除数,所以一个数字的1/2以后是不可能还会被整除的。
注意此时多了一个“=”号,这样剔除了平方数。
int Prime(int num){
if (num <2){
return 0;
}
for (int i = 2; i <num; i++){
if (num%i == 0){
return 0;
}
}
return 1;
}
改成:
int Prime(int num){
if (num <2){
return 0;
}
for (int i = 2; i <=num/2; i++){
//这里的for条件改变
if (num%i == 0){
return 0;
}
}
return 1;
}
调用平方根函数
也改了for循环的条件,这样就直接减更多的计算量。
因为一个数字的两个除数必要有一个小于或者等于其平方根的值。
注意此时多了一个“=”号,这样剔除了平方数。
加上头文件:
#include<math.h>
int Prime(int num){
if (num <2){
return 0;
}
for (int i = 2; i <num; i++){
if (num%i == 0){
return 0;
}
}
return 1;
}
改成
int Prime(int num){
if (num <2){
return 0;
}
for (int i = 2; i <=sqrt(num*1.0); i++){
//这里引用了平方根函数sqrt
if (num%i == 0){
return 0;
}
}
return 1;
}
补充:
还有一个优化思路,除了2和3外没有两个素数是相邻的。所以可以i+=2。前提是奇数开始