前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【C语言必刷题】4. 打印100~200之间的素数

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

作者头像
爱敲代码的小杨.
发布2024-05-07 19:20:40
670
发布2024-05-07 19:20:40
举报
文章被收录于专栏:JavaJava

🔥 题目描述

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

🔥 解题思路

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

  1. 试除法:从 2x-1 ,逐个尝试是否能整除 x,如果能,x就不是素数,否则 x 是素数 优化代码:当 x 为偶数时,x 一定不是素数,因此在遍历时我们可以跳过每个偶数
  2. 试除法时间优化:
    • 2x-1 中存在某个数 t 可以整除 x 时,令 d = x/t,则 d 也可以整除 x,并且结果为 t。因 此,当 2~
    \sqrt[]x

    中不存在可以整除x的数时,

    \sqrt[]x+1

    ​~ x 也不存在可以整除 x 的数。

    • 利用反证法证明:
      1. 假设 2x-1 中不存在可以整除 x 的数,
      \sqrt[]x+1

      ~x 中存在⼀个数 d 可以整除 x

      1. 存在另⼀个数 t=x/d 也可以整除 x
      2. t*d=x,因为 d>
      \sqrt[]x

      ,所以 t<

      \sqrt[]x

      ,即 2x-1 中存在某个数 t 可以整除 x

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

🔥代码

代码语言:javascript
复制
#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;
}

运行结果:

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-02-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 🔥 题目描述
  • 🔥 解题思路
  • 🔥代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档