一、简单遍历

这是一个简单的C语言程序,实现的功能是打印出2到100之间的所有素数。

程序的基本思路是:用变量i从2开始逐个遍历到100,对于每一个i,用变量j从2开始逐个遍历到i-1,如果i能被j整除,则说明i不是素数,将isPrime标志位设为0,然后跳出循环。如果在循环结束后isPrime仍然是1,则说明i是素数,将其打印出来即可。

#include <stdio.h>int main() {int i, j;for (i = 2; i <= 100; i++) {int isPrime = 1;for (j = 2; j < i; j++) {if (i % j == 0) {isPrime = 0;break;}}if (isPrime == 1) {printf("%d\n", i);}}return 0;
}

二、遍历至该数的平方根

程序的基本思路是:定义一个isprime函数,用来判断一个数是否为素数。isprime函数的实现方式与之前的程序相同,用一个循环遍历到该数的平方根即可。

在主函数中,用for循环逐个枚举2到n之间的数字,如果这个数字是素数就打印出来,并将cnt计数器自增。最后输出素数的总个数。

相较于之前的程序,这个程序代码更加简洁,可读性也更好,而且使用了一个新的函数来判断素数,使得程序更加模块化,代码复用性更高。

#include<stdio.h>
#include<math.h>bool isprime(int x)
{for (int i = 2; i <=sqrt(x); i++){if (x % i == 0) return 0;}return 1;
}int main()
{int n, cnt = 0;scanf("%d", &n);for (int i = 2; i <= n; i++){if (isprime(i)){cnt++;printf("%d\n", i);}}return 0;
}

三、用x/i来代替sqrt(x)

        对于i<=sqrt(x) sqrt函数的计算会比较慢,因此我们两边平方后,移一个i过去右边,变成i<=x/i 这样就能避免溢出的问题 。程序的代码基本与之前的程序相同,只是在函数isprime中的循环控制条件做了一下优化,用x/i来代替sqrt(x),达到减少循环次数的效果。

#include<stdio.h>bool isprime(int x)
{for (int i = 2; i <= x / i; i++){if (x % i == 0) return 0;}return 1;
}int main()
{int n,cnt=0;double t1 = clock();scanf("%d", &n);for (int i = 2; i <= n; i++){if (isprime(i)){cnt++;printf("%d\n", i);}}return 0;
}

四、朴素筛法

一个合数一定存在非1非本身的质因子。

程序的基本思路是:首先定义一个长度为n的数组pri,用来记录每一个数字是否是素数。然后用for循环遍历到n的平方根,如果i是素数,则用一个内部循环依次去除i的倍数,将这些数标记为合数。最后再用for循环遍历整个数组,将所有没有被标记过的数字输出出来。

这个算法的优点在于避免了之前程序内部判断素数时的重复计算,同时减少了程序的循环次数。缺点是需要用一个数组来存储中间状态,可能会消耗更多的内存。

#include<stdio.h>
//0为素数,1为合数
int pri[100] = {0};int main()
{int n,cnt=0;double t1 = clock();scanf("%d", &n);for (int i = 2; i <= n/i; i++){if (!pri[i])//没被筛过{for (int j = 2 * i; j <= n; j += i)//去除合数{pri[j] = 1;}}}for (int i = 2; i <= n; i++){if (!pri[i]){cnt++;printf("%d\n", i);}}return 0;
}

五、埃式筛法

该程序是朴素筛法程序的一个修正,主要在内部循环的控制条件上做了改变。

由于在之前的程序中,内部循环是从2 * i开始依次将i的倍数标记为合数。但在这个程序中,内部循环是从i * i开始依次将i的倍数标记为合数。这是因为在i * i之前,这些数字已经被其他的素数筛选过了,所以不需要再次去除。

这个算法的优点和上一个程序的优点一样,避免了之前程序的重复计算,减少了程序的循环次数。同时由于内部循环的起始位置不同,也稍微提高了一点点程序的执行效率。

#include<stdio.h>
int pri[100] = {0};int main()
{int n,cnt=0;double t1 = clock();scanf("%d", &n);for (int i = 2; i <= n/i; i++){if (!pri[i])//没被筛过{for (int j = i * i; j <= n; j += i)//去除合数{pri[j] = 1;}}}for (int i = 2; i <= n; i++){if (!pri[i]){cnt++;printf("%d\n", i);}}return 0;
}

六、欧拉筛法

欧拉筛法是一种高效的求解素数的算法,其本质基于线性筛法的思想。

欧拉筛法的核心思想是筛去每个数的所有质因数,使得每个数只被它的最小质因数筛选一次。首先将2到n范围内的所有数都标记为素数,然后从2开始循环到n,对于每个数i,如果它是素数,则将其加入素数数组中,并将它的所有倍数(除了它本身)标记为合数。对于一个合数i*j,它已经被i筛选过了,所以其最小质因数一定是i,因此只需要将其标记一次即可。

另外,为了保证每个合数都只会被它的最小质因数筛选一次,算法中添加了一个优化条件,即当i能够整除当前质数数组中的某个数j时,直接将i*j标记为合数,跳过后续的循环过程。

欧拉筛法的时间复杂度为O(n),相比于朴素筛法和埃式筛法,具有更高的效率和更低的时间复杂度。

#include <stdio.h>
#include <stdbool.h>int main()
{int n = 100;bool isPrime[101];int prime[101];int cnt = 0; //记录素数的个数for (int i = 2; i <= n; i++)isPrime[i] = true;for (int i = 2; i <= n; i++){if (isPrime[i]){prime[cnt++] = i; //将i加入素数数组}for (int j = 0; j < cnt && i * prime[j] <= n; j++){isPrime[i * prime[j]] = false; //将当前数与质因数的积标记为合数if (i % prime[j] == 0)break; //优化,保证每个合数只会被它的最小质因数筛选一次}}for (int i = 0; i < cnt; i++){printf("%d\n", prime[i]);}return 0;
}

C语言 | 六种方法输出100以内的素数 | 代码演示相关推荐

  1. 20以内的素数编码C语言,用C语言 输出100以内的素数,

    用C语言 输出100以内的素数, 用C语言 输出100以内的素数, 输出100以内的素数,谁能帮一下,我做了好久没做出来,也想了好久, 能带注释那更好了,我是新中新手,还有很多很多的不懂, 搜索更多相 ...

  2. 输出100以内的偶数c语言程序,C语言基础:输出100以内的奇数和偶数

    C语言基础:输出100以内的奇数和偶数 #include int main() { int counter; printf("\nEven values\n"); for (cou ...

  3. java穷举法找素数,使用穷举法输出100以内所有素数

    满意答案 //使用穷举法输出100以内所有素数 class Prime { public static void main(String[] args) { for(int n=2;n<101; ...

  4. js输出100以内的质数_JavaScript 斐波那契数列 倒序输出 输出100以内的质数代码实例...

    这篇文章主要介绍了JavaScript 斐波那契数列 倒序输出 输出100以内的质数代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 斐波那契 ...

  5. python输出100以内的素数

    可以使用以下代码来输出100以内的素数: for num in range(2, 101):for i in range(2, num):if (num % i) == 0:breakelse:pri ...

  6. 输出100以内的素数【C语言】

    实际判断可以不用对当前数之前的所有数进行除余判断,只需对之前已求出的素数除余即可. #include<stdio.h> int main() {bool isPrime = true;in ...

  7. JS输出100以内的素数

    方法一: var str = '';for (let i = 2; i < 100; i++) {var a = true;for (let j = 2; j < i; j++) {// ...

  8. 2种简易方法求100以内的素数(质数)

    第一种 document.write('2');//此处直接输出2 for(var i = 3; i <= 100; i++){ for(var j = 2; j <= i; j++){ ...

  9. Java输出100以内的素数

    for(int i=2;i<isprime.length;i++){isprime[i]=true;//系统会定义isprime[i]为0:}for(int i=2;i<isprime.l ...

最新文章

  1. android l是哪个版本,从Android L及更高版本开始,setMobileDataEnabled方法不再可调用...
  2. 数据库查询的数据导出到xls表,集合数据导出到xls表
  3. 对齐内容验证码和图片
  4. python如何判断字典中是否存在某个键_总结:11个Python3字典内置方法大全及示例...
  5. 私有云和公有云的区别_如何理解公有云和私有云
  6. PowerShell在Exchange2010下交互式修改群组审批人和免审批邮箱
  7. mfc this指针
  8. C/C++ list链表的理解以及使用
  9. 马斯克:大量特斯拉汽车将会在年底前交付
  10. 【Java从0到架构师】Redis 进阶 - pipline、发布订阅、Bitmap、HyperLogLog、GEO
  11. 奔向成功,有志人士创业的十大策略
  12. Go语言基础进阶—程序结构—声明
  13. python选择法_新手小白如何学习Python 选对方法很重要(附教程)
  14. 快速在小程序上实现“友情链接/合作伙伴”功能
  15. 2022年Mathorcup数学建模挑战杯C题比赛心得总结(1)——A*算法的应用与优化(含Matlab代码)
  16. 哈工大材力上机 matlab,材力上机Matlab哈工大
  17. Java算法:经纬度转换 将百度转为高德经纬度
  18. Removing unused resources requires unused code shrinking to be turned on 解决
  19. pyscripter与python的关系_详解python开发环境PyScripter中文乱码问题解决方案
  20. 【uniapp】 两种上拉加载方式

热门文章

  1. 调用转账到支付宝账户的接口后,账户被封禁,如何处理?
  2. arm-linux-strip是减肥工具而不是压缩工具
  3. 关于open函数文件打开模式的有意思的一个现象
  4. eCryptfs v0.1 Design Document
  5. vostro3070装win7_戴尔Vostro 成就3070台式机怎么装win10系统?
  6. vite创建ts项目定义变量无法类型检测
  7. 【H3C V7路由器实战课程系列-2】WAN接入配置与管理-王达-专题视频课程
  8. Spring的Factories机制介绍
  9. R语言使用gls函数拟合模型并可视化模型的预测值及其置信区间实战
  10. Problem 2091 播放器 模拟问题 I never stop loving you, but I just don't want anybody to see it any more.