C语言 · 素数判断

 算法提高 素数判断  
时间限制:1.0s   内存限制:512.0MB
    
编写一函数IsPrime,判断某个大于2的正整数是否为素数。
样例输入: 
5
样例输出:
yes
样例输入: 
9
样例输出:
no
注意:是素数输出yes,不是素数输出no,其中yes和no均为小写。

 1 #include<stdio.h>
 2 #include<math.h>
 3 int IsPrime(int n){
 4         int k=sqrt(n+1);
 5         for(int i=2;i<=k;i++){
 6             if(n%i==0){
 7                 printf("no");
 8                 return 0;
 9             }
10         }
11         printf("yes");
12 }
13 int main(){
14     int n;
15     scanf("%d",&n);
16     IsPrime(n);
17 }

 

在C语言中,有多种方法可以实现质数(素数)的判断,以下是几种常见的方法及代码示例: ### 方法:基本方法 通过使用2到`i - 1`之间的数字去试除`i`,如果`i`能被整除,则`i`不是素数;若2到`i - 1`之间没有数字可以整除`i`,则`i`是素数。 ```c #include <stdio.h> int main() { int i = 0; int count = 0; for (i = 100; i <= 200; i++) { int j = 0; int flag = 1; // 假设i是素数 for (j = 2; j <= i - 1; j++) { if (i % j == 0) { flag = 0; break; } } if (flag == 1) { count++; printf("%d\n", i); } } printf("\n100~200共有%d个素数\n", count); return 0; } ``` ### 方法二:使用sqrt()函数优化 由于个数`x`如果不是素数,那么它定可以分解为两个因数`a`和`b`,其中`a <= sqrt(x)`且`b >= sqrt(x)`。因此,只需要检查到`sqrt(x)`即可。 ```c #include <stdio.h> #include <math.h> int IsPrime(int x) { int ret = 1; if (x == 1 || (x != 2 && x % 2 == 0)) ret = 0; for (int i = 3; i < sqrt(x); i += 2) { if (x % i == 0) { ret = 0; break; } } return ret; } ``` ### 方法三:对6的倍数两侧进行判断 质数(除2和3外)定在6的倍数两侧,但在6的倍数两侧的数不定是质数。 ```c #include <stdio.h> #include <math.h> bool isPrime_3(int num) { if (num == 2 || num == 3) return true; if (num % 6 != 1 && num % 6 != 5) return false; for (int i = 5; i <= sqrt(num); i += 6) { if (num % i == 0 || num % (i + 2) == 0) return false; } return true; } ``` ### 方法四:利用已判断过的素数进行判断 通过判断个数是否能被已经判断过的并且小于该数的素数整除,利用数组存储已判断过的素数。 ```c #include <stdio.h> #define N 50 int IsPrime(int x, int known[], int number); int main() { int i = 3; int count = 1; int array[N] = {2}; while (count < N) { if (IsPrime(i, array, count)) array[count++] = i; i++; } for (i = 0; i < N; i++) { printf("%d", array[i]); if ((i + 1) % 5 == 0) printf("\n"); else printf("\t"); } return 0; } int IsPrime(int x, int known[], int number) { int ret = 1; int i; for (i = 0; i < number; i++) { if (x % known[i] == 0) { ret = 0; break; } } return ret; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值