news 2026/5/9 0:09:26

C语言实现埃拉托斯特尼筛法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C语言实现埃拉托斯特尼筛法

这段 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是否为素数。

🔍 逐行详细解释

1. 头文件与全局变量

#include <stdio.h> int prime[100] = {0};
  • 引入标准输入输出库。
  • 定义一个大小为 100 的整型数组prime,所有元素初始化为 0。 - 这个数组将作为“筛子”:下标代表数字,值代表是否为合数。

2. 筛法函数init_prime(int n)

void init_prime(int n) { prime[0] = prime[1] = 1;
  • 0 和 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*ii的倍数(如2*i, 3*i, ..., (i-1)*i)已经被更小的素数筛过了。

printf("\n"); } return ; }
  • 每处理完一个素数,换行。

3. 主函数main()

int main() { init_prime(50);
  • 对 0~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]: - 如果输出0x是素数; - 如果输出1x不是素数。
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 等数会被多个素数重复筛(这是正常的,但效率略低;可优化,但不影响正确性)。


⚠️ 潜在问题或注意事项

  1. 数组越界风险: -prime数组大小是 100,但init_prime(50)是安全的(只用到下标 0~50)。 - 但如果用户输入x >= 100,比如x = 150,就会访问prime[150],导致未定义行为(可能崩溃或读到垃圾值)。 - ✅ 建议加判断:if (x < 0 || x >= 100) { printf("Out of range\n"); continue; }

  2. 命名反直觉: -prime[i] == 0表示是素数,这容易让人困惑。 - 更常见的做法是叫is_composite[]not_prime[],或者反过来:is_prime[i] = 1表示是素数。

  3. 打印干扰逻辑: - 打印筛的过程是为了演示,实际使用筛法时通常不打印。


✅ 总结

这段代码的核心是:

  • 用埃拉托斯特尼筛法预处理出 0~50 范围内所有素数
  • 通过一个布尔数组(用 int 模拟)快速查询任意数是否为素数
  • 交互式地让用户测试查询结果

它是一个很好的教学示例,展示了:

  • 筛法思想
  • 数组作为标记表的用法
  • C 语言的循环、条件、输入输出

如果你是为了学习素数判断或筛法,这段代码非常有价值!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/2 10:14:12

DLSS Swapper完整使用手册:游戏性能优化的终极解决方案

DLSS Swapper完整使用手册&#xff1a;游戏性能优化的终极解决方案 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 还在为游戏卡顿和画质不佳而烦恼吗&#xff1f;DLSS Swapper为你提供了一键切换DLSS版本的强大能力&a…

作者头像 李华
网站建设 2026/4/30 18:22:55

快速理解变频器控制板PCB布局布线核心要点

变频器控制板PCB设计&#xff1a;从噪声对抗到系统稳定的实战指南你有没有遇到过这样的情况&#xff1f;明明算法跑得完美&#xff0c;PWM波形仿真也干净利落&#xff0c;可一上电——电机抖动、采样跳数、通信频繁丢包&#xff0c;甚至莫名其妙复位。排查半天&#xff0c;最后…

作者头像 李华
网站建设 2026/5/6 22:01:34

中文BERT语义填空实战:成语与惯用语处理

中文BERT语义填空实战&#xff1a;成语与惯用语处理 1. 引言 1.1 BERT 智能语义填空服务 在自然语言处理领域&#xff0c;语义理解是实现智能化交互的核心能力之一。近年来&#xff0c;基于预训练语言模型的掩码预测技术取得了显著进展&#xff0c;其中 BERT&#xff08;Bid…

作者头像 李华
网站建设 2026/5/2 4:19:31

深度解析Voice Sculptor:指令化语音合成的核心技术

深度解析Voice Sculptor&#xff1a;指令化语音合成的核心技术 1. 技术背景与核心价值 近年来&#xff0c;语音合成技术经历了从传统参数化方法到端到端深度学习模型的跨越式发展。随着大语言模型&#xff08;LLM&#xff09;和多模态理解能力的提升&#xff0c;指令化语音合…

作者头像 李华
网站建设 2026/5/6 13:08:02

如何提升推理稳定性?DeepSeek-R1-Distill-Qwen-1.5B温度设置教程

如何提升推理稳定性&#xff1f;DeepSeek-R1-Distill-Qwen-1.5B温度设置教程 1. 模型介绍与核心优势 1.1 DeepSeek-R1-Distill-Qwen-1.5B模型架构解析 DeepSeek-R1-Distill-Qwen-1.5B 是由 DeepSeek 团队基于 Qwen2.5-Math-1.5B 基础模型&#xff0c;结合 R1 架构特性&#…

作者头像 李华
网站建设 2026/5/3 2:11:26

WPS-Zotero插件:打造你的学术写作终极武器库

WPS-Zotero插件&#xff1a;打造你的学术写作终极武器库 【免费下载链接】WPS-Zotero An add-on for WPS Writer to integrate with Zotero. 项目地址: https://gitcode.com/gh_mirrors/wp/WPS-Zotero 还在为论文写作中繁琐的文献引用而头疼吗&#xff1f;WPS-Zotero插件…

作者头像 李华