C语言——质数

it2023-09-05  85

三种方法求质数:

一、原理:每个合数都可以被质数整除;

1.把每个求出的质数存放在数组str[]中, 2.合数i整除数组中的质数, 3.将数组最后的数传给x; 4.再让i除x直到除到i-1; 5.再把i放入数组中;

#include<stdio.h> #include<math.h> #define N 1000 void sushu(int str[N]); int main() { int str[N]={'1'};//将str初始化都为1; sushu(str); return 0; } void sushu(int str[N]) { int i=2,j=0,k=0,x=0,p=0,z=0; int n; printf("输入需要素数的范围\n"); scanf("%d",&n); str[0]=2; while(i<=n) { j=0; p=1; while(j<k) { if(i%str[j]==0) { p=0; break; } j++; } x=str[j-1]; while(x<=i-1) { if(i%x==0) { p=0; break; } x++; } if(p==0) { i++; continue; } str[k]= i; i++; k++;//k获取素数数组的最大角标 } while(z<k) { printf("%d ",str[z]); z++; } }

优点:

质数放在 数组str中,可以被调用;

缺点:

只能算出0~1000以内的质数;

二、原理:从j=2开始递增依次判断是否有j可以被i整除

#include<stdio.h> int main() { int i,j,k=0; for(i=2;i<1000000000000000000000000000000000000000000000000000000000000000;i++)//64位 { for(j=2;j*j<=i;j++) if(i%j==0) break; if(j*j>i) { printf("%d ",i); k++; if(k%5==0) printf("\n"); } } }

优点:

可以判断2~10(64次方)之间的质数;

缺点:

判断出的数值无法被调用:

三、原理:去除素数的倍数筛选质数,与原理一类似;

#include<stdio.h> #include<math.h> #define N 10000 void prime(int n); int str[N]; int main() { int i,n; printf("输入一个数判断是否是质数\n"); scanf("%d",&n); prime(n); for(i=2;i<=n;i++) if(str[i])//判断值数; printf("%d ",i); return 0; } void prime(int n) { int i,j,m; for(i=2;i<=n;i++) str[i]=1; str[0]=str[1]=0; m=sqrt(n); for(i=2;i<=m;i++) { if(str[i]) for(j=2*i;j<=n;j=j+i)//筛选素数的整数倍: str[j]=0; } }

优点:

1.可以计算0~100000000(一亿); 2.可对一个数进行单独判断是否是质数并调用;

缺点:

1.数据利用率不高,不能直接大批量调用;
最新回复(0)