c语言判断素数的方法

在C语言中,判断一个数是否为素数的方法如下:

试除法

基本思想:用2到根号n之间的所有整数去除n,如果都无法整除,则n为素数。

代码示例

c<p> include <stdio.h><p> include <math.h></p><p> int is_prime(int n) {<p> if (n <= 1) return 0;<p> for (int i = 2; i <= sqrt(n); i++) {<p> if (n % i == 0) return 0;<p> }<p> return 1;<p> }</p><p> int main() {<p> int number;<p> printf("请输入一个整数: ");<p> scanf("%d", &number);<p> if (is_prime(number)) {<p> printf("%d 是素数。\n", number);<p> } else {<p> printf("%d 不是素数。\n", number);<p> }<p> return 0;<p> }<p>

质数筛

基本原理:初始化一个布尔型数组is_prime,长度为要检查的数的个数,初始值为true。从2开始,对每个数字i,如果is_prime[i]为true,则i是素数。对于i的所有倍数j(从i*i到n),将is_prime[j]设置为false。

代码示例

c<p> include <stdio.h><p> include <stdbool.h><p> include <math.h><p> include <string.h></p><p> void sieve_of_eratosthenes(int n) {<p> bool is_prime[n + 1];<p> memset(is_prime, true, sizeof(is_prime));<p> is_prime = is_prime = false;</p><p> for (int i = 2; i * i <= n; i++) {<p> if (is_prime[i]) {<p> for (int j = i * i; j <= n; j += i) {<p> is_prime[j] = false;<p> }<p> }<p> }</p><p> for (int i = 2; i <= n; i++) {<p> if (is_prime[i]) {<p> printf("%d ", i);<p> }<p> }<p> }</p><p> int main() {<p> int n;<p> printf("输入一个正整数: ");<p> scanf("%d", &n);<p> sieve_of_eratosthenes(n);<p> return 0;<p> }<p>

费马小定理

基本原理:对于任何素数p和任何整数a,a^p - a模p为0。我们可以使用此定理来判断一个数字是否为素数。

代码示例

c<p> include <stdio.h><p> include <math.h><p> include <stdbool.h></p><p> bool is_prime_fermat(int n, int a) {<p> return pow(a, n - 1) % n == 1;<p> }</p><p> int main() {<p> int n;<p> int a;<p> printf("输入一个正整数: ");<p> scanf("%d", &n);<p> printf("输入一个整数a (1 < a < n): ");<p> scanf("%d", &a);</p><p> if (is_prime_fermat(n, a)) {<p> printf("%d 可能是素数。\n", n);<p> } else {<p> printf("%d 不是素数。\n", n);<p> }<p> return 0;<p> }<p>

这些方法中,试除法是最常用且高效的,适用于大多数情况。质数筛适用于需要生成素数列表的情况,而费马小定理适用于需要较高准确性的情况,但需要多次测试以提高可靠性。