当前位置:首页 » 《随便一记》 » 正文

【C语言必刷题】4. 打印100~200之间的素数

7 人参与  2024年03月01日 16:24  分类 : 《随便一记》  评论

点击全文阅读


在这里插入图片描述

?博客主页:爱敲代码的小杨.

✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》

❤️感谢大家点赞??收藏⭐评论✍?,您的三连就是我持续更新的动力❤️

?小杨水平有限,欢迎各位大佬指点,相互学习进步!


文章目录

? 题目描述? 解题思路?代码

? 题目描述

使用C语言写一个程序打印100~200之间的的素数,数字中间使用空格分割。

? 解题思路

素数是指只能被1和它本身整除的正整数。我们可以遍历100~200,并找出那些数字是素数。

试除法:从 2x-1 ,逐个尝试是否能整除 x,如果能,x就不是素数,否则 x 是素数

优化代码:当 x 为偶数时,x 一定不是素数,因此在遍历时我们可以跳过每个偶数

试除法时间优化:

2x-1 中存在某个数 t 可以整除 x 时,令 d = x/t,则 d 也可以整除 x,并且结果为 t。因
此,当 2~ x \sqrt[]x x ​中不存在可以整除x的数时, x + 1 \sqrt[]x+1 x ​+1​~ x 也不存在可以整除 x 的数。

利用反证法证明:

假设 2x-1 中不存在可以整除 x 的数, x + 1 \sqrt[]x+1 x ​+1~x 中存在⼀个数 d 可以整除 x

存在另⼀个数 t=x/d 也可以整除 x

t*d=x,因为 d> x \sqrt[]x x ​ ,所以 t< x \sqrt[]x x ​,即 2x-1 中存在某个数 t 可以整除 x

与假设矛盾,反证成成立。

?代码

#include <stdio.h>int main(){    int i = 0;    for (i = 100; i <= 200; i++) // 遍历100到200之间的每个数    {        int flg = 1; // flg用于标记是否为素数,初始假设为素数        int j = 0;        for (j = 2; j < i; j++) // 遍历2到i-1之间的每个数        {            if (i % j == 0) // 若i能被j整除,则i不是素数            {                flg = 0; // 修改flg标记为0,表示i不是素数                break;    // 退出内层循环,无需继续判断            }        }        if (flg != 0) // 若flg为1,表示i是素数        {            printf("%d ", i); // 输出素数i        }    }    return 0;}// 优化1#include <stdio.h>int main(){    int i = 0;    for (i = 101; i <= 200; i += 2) // 从101开始,每次增加2,遍历101到200之间的每个奇数    {        int flg = 1; // flg用于标记是否为素数,初始假设为素数        int j = 0;        for (j = 2; j < i; j++) // 遍历2到i-1之间的每个数        {            if (i % j == 0) // 若i能被j整除,则i不是素数            {                flg = 0; // 修改flg标记为0,表示i不是素数                break;    // 退出内层循环,无需继续判断            }        }        if (flg != 0) // 若flg为1,表示i是素数        {            printf("%d ", i); // 输出素数i        }    }    return 0;}// 优化2#include <stdio.h>#include <math.h>int main(){    int i = 0;    for (i = 101; i <= 200; i += 2) // 从101开始,每次增加2,遍历101到200之间的每个奇数    {        int flg = 1; // flg用于标记是否为素数,初始假设为素数        int j = 0;        for (j = 2; j <= sqrt(i); j++) // 遍历2到sqrt(i)之间的每个数        {            if (i % j == 0) // 若i能被j整除,则i不是素数            {                flg = 0; // 修改flg标记为0,表示i不是素数                break;    // 退出内层循环,无需继续判断            }        }        if (flg != 0) // 若flg为1,表示i是素数        {            printf("%d ", i); // 输出素数i        }    }    return 0;}

运行结果:

image-20240220101541474


点击全文阅读


本文链接:http://zhangshiyu.com/post/72185.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1