通用main()函数部分
#include<stdio.h>
int isPrime(int x);
int main(){
int x;
scanf("%d",&x);
if (isPrime(x)){
printf("%d is Prime",x);
}
else{
printf("%d is not prime",x);
}
return 0;
}
1.效率几乎最低
1.判断是否是偶数(x%2 == 0)
2.逐步递增i+=2(由于第1步排除了偶数部分,因此可以仅看奇数的部分),并求余,存在可以求余的部分,则判断其为素数
循环n/2遍
int isPrime(int x){
int ret = 1;
int i;
if(x%2==0){
ret = 0;
}
else{
for(i=3;i<x;i+=2){
if(x%i==0){
ret = 0;
break;
}
}
}
return ret;
}
2.平方根求余
与1.相比,需要引用<math.h>,循环至x的平方根即可
由于x =sqrt(x) * sqrt(x)
所以任意的x = m * n,m或n<sqrt(x)
所以判断至平方根即可
循环sqr(x)遍
#include<stdio.h>
#include<math.h>
int isPrime(int x);
int main(){
int x;
scanf("%d",&x);
if (isPrime(x)){
printf("%d is Prime",x);
}
else{
printf("%d is not prime",x);
}
return 0;
}
int isPrime(int x){
int ret = 1;
int i;
if(x%2==0){
ret = 0;
}
else{
for(i=3;i<sqrt(x);i+=2){
if(x%i==0){
ret = 0;
break;
}
}
}
return ret;
}
3.构造素数表【1.0】
【1.0】限定素数表的长度:最终生成的素数表最大值未知,但是素数表长度已知
更新isPrime函数
与前两个函数相比,主要的区别在于多了两个参数:
int knownprimes[] -->素数表
int numberofknownprimes -->素数表的长度
将输入的数(x)与素数表中的每个数(knownprimes[i])进行对比
int isPrime(int x,int knownprimes[],int numberofknownprimes){
int ret = 1;
int i;
for(i=0;i<numberofknownprimes;i++){
if(x%knownprimes[i]==0){
ret = 0;
break;
}
}
return ret;
}
主函数
需要变量:
- 素数数组的长度(number)
- 初始数组 prime[number],并令初始素数数组为{2}
- 被判断是否是数组的数:i (与之前的判断不同,之前是scanf一个数字,以这个输入的数字一步步判断)
- 具体的更新过程,利用上述的isPrime函数,将i从3开始判断,与现有的数组进行对比
int main(void){
const int number = 100;//素数表的长度
int count = 1;//下标,仅代表素数存储的位置
int prime[number] ={2};
int i = 3;//被判断的素数
while(count<number){
if(isPrime(i,prime,count)){
prime[count++] = i;
}
i++;
}
//打印素数表
for(i=0;i<number;i++){
printf("%d",prime[i]);
if((i+1)%5==0){
printf("\n");
}
else{
printf("\t");
}
return 0;
举例来说:
第一次循环:i = 3 prime[] = {2,0,....} count = 2 prime[2]=3;(3仅与2对比)
第二次循环:i = 4 prime[] = {2,3,0,....},count = 2 ;(4与2对比后即结束循环)
第三次循环:i = 5 prime[] = {2,3,0,...},count = 3 prime[3]=5;(5与2、3对比之后被判断为素数,因此加入素数表)
4.构建素数表【2.0】
不知道素数表长度,但是知道素数表内的最大的素数
素数表结构:
- 下标:被判断是否为素数的对象
- 元素:0或者1(0表示不是素数,1表示是素数)
int main(){
const int maxnumber = 25;//素数表中所有的数均小于这个数
int i;
int x;//被判断为是否为素数的数
int isPrime[maxnumber];//原始数组
for(i=0;i<maxnumber;i++){
isPrime[i] = 1;//先假设所有数均为素数
}
for(x=2;x<maxnumber;x++){//判断x是否为素数,注意!x从2开始判断
if(isPrime[x]){//2一定为素数,2的倍数均不为素数
for(i=2;i*x<maxnumber;i++){//令所有坐标为x的倍数的元素为0(即:不为素数),注意!i从2开始判断
isPrime[i*x] = 0;
}
}
}
for(i=2;i<maxnumber;i++){
if(isPrime[i]){
printf("%d\t",i);
}
}
return 0;
}