工程项目配套供应企业生产厂家选购参考汇总
2026/10/2 20:37:04
这段 C 语言代码实现了一个埃拉托斯特尼筛法(Sieve of Eratosthenes)的变种,用于标记小于等于 n 的所有非素数(合数),并打印出每个素数及其筛掉的倍数。最后程序会不断读入用户输入的整数x,并输出prime[x]的值,用来判断x是否为素数。
#include<stdio.h> int prime[100] = {0}; void init_prime(int n) { prime[0] = prime[1] = 1; for (int i = 2; i * i <= n; i++) { if (prime[i]) continue; printf("%d is prime : ", i); for (int j = i * i; j <= n; j += i) { prime[j] = 1; printf(" %d", j); } printf("\n"); } return ; } int main() { init_prime(50); int x; while (scanf("%d", &x) != EOF) { printf("prime[%d] = %d\n", x, prime[x]); } return 0; }这个代码是什么意思,请你详细解答
prime[100],初始化为全 0。prime[i] == 0表示i 是素数; -prime[i] == 1表示i 不是素数(被筛掉了)。init_prime(50):对 0~50 范围内的数进行筛法处理,并打印过程。x是否为素数。#include <stdio.h> int prime[100] = {0};prime,所有元素初始化为 0。 - 这个数组将作为“筛子”:下标代表数字,值代表是否为合数。init_prime(int n)void init_prime(int n) { prime[0] = prime[1] = 1;for (int i = 2; i * i <= n; i++) {i = 2开始遍历到√n(因为大于 √n 的合数一定已被更小的因子筛过)。if (prime[i]) continue;prime[i] == 1,说明i已经被标记为合数,跳过。prime[i] == 0(即i是素数)时,才继续筛它的倍数。printf("%d is prime : ", i);i。for (int j = i * i; j <= n; j += i) { prime[j] = 1; printf(" %d", j); }i*i开始,把i的所有倍数(i*i, i*(i+1), ...)都标记为合数(prime[j] = 1)。✅为什么从
i*i开始?因为小于i*i的i的倍数(如2*i, 3*i, ..., (i-1)*i)已经被更小的素数筛过了。
printf("\n"); } return ; }main()int main() { init_prime(50);int x; while (scanf("%d", &x) != EOF) { printf("prime[%d] = %d\n", x, prime[x]); }x,直到遇到文件结束(EOF,比如在 Linux 下按 Ctrl+D,Windows 下按 Ctrl+Z)。prime[x]: - 如果输出0→x是素数; - 如果输出1→x不是素数。return 0; }假设你运行程序后输入:
2 4 17 25可能看到的输出(筛法过程 + 查询结果):
2 is prime : 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 3 is prime : 9 12 15 18 21 24 27 30 33 36 39 42 45 48 5 is prime : 25 30 35 40 45 50 7 is prime : 49 prime[2] = 0 prime[4] = 1 prime[17] = 0 prime[25] = 1注意:12、18、30 等数会被多个素数重复筛(这是正常的,但效率略低;可优化,但不影响正确性)。
数组越界风险: -prime数组大小是 100,但init_prime(50)是安全的(只用到下标 0~50)。 - 但如果用户输入x >= 100,比如x = 150,就会访问prime[150],导致未定义行为(可能崩溃或读到垃圾值)。 - ✅ 建议加判断:if (x < 0 || x >= 100) { printf("Out of range\n"); continue; }
命名反直觉: -prime[i] == 0表示是素数,这容易让人困惑。 - 更常见的做法是叫is_composite[]或not_prime[],或者反过来:is_prime[i] = 1表示是素数。
打印干扰逻辑: - 打印筛的过程是为了演示,实际使用筛法时通常不打印。
这段代码的核心是:
它是一个很好的教学示例,展示了:
如果你是为了学习素数判断或筛法,这段代码非常有价值!