首页 > 其他分享 >C语言实例之10求0-200内的素数

C语言实例之10求0-200内的素数

时间:2024-11-26 23:05:17浏览次数:12  
标签:10 return 200 int C语言 素数 num 整除 isPrime

1. 素数

素数(Prime number),也叫质数,是指在大于 1 的自然数中,除了 1 和它自身外,不能被其他自然数整除的数。例如 2、3、5、7、11 等都是素数,而 4 能被 2 整除、6 能被 2 和 3 整除,所以它们不是素数。

2. 素数的特性与判断思路

素数是指在大于 1 的自然数中,除了 1 和它自身外,不能被其他自然数整除的数。要判断一个数num是否为素数,最直接的方法是从 2 开始,依次检查num能否被小于它的每个数整除,如果都不能整除,那么num就是素数。
然而,这种方法的效率比较低。实际上,只需要检查num能否被小于等于sqrt(num)的数整除就可以了(这是基于一个数学原理:如果一个数num不是素数,那么它一定有一个小于等于sqrt(num)的因子)。

3. 实例代码

#include <iostream>
#include <cmath>

// 判断一个数是否为素数
bool isPrime(int num) {
    if (num <= 1) {
        return false;
    }
    if (num <= 3) {
        return true;
    }
    if (num % 2 == 0 || num % 3 == 0) {
        return false;
    }

    for (int i = 5; i <= std::sqrt(num); i += 6) {
        if (num % i == 0 || num % (i + 2) == 0) {
            return false;
        }
    }

    return true;
}

int main() {
    std::cout << "0到200之间的素数有:" << std::endl;
    for (int i = 0; i <= 200; ++i) {
        if (isPrime(i)) {
            std::cout << i << " ";
        }
    }
    std::cout << std::endl;

    return 0;
}

4. 分析

  • isPrime函数用于判断一个数是否为素数。首先处理了小于等于1的数肯定不是素数以及2、3这两个特殊素数的情况。然后通过排除能被2和3整除的数来初步筛选,接着使用循环从5开始,每次增加6(因为大于3的素数一定可以表示为 6k ± 1 的形式,k为整数,i的值依次为 5、11、17、23…… 这些数都是6k - 1的形式;同时,对应的i + 2的值依次为 7、13、19、25…… 这些数都是6k + 1的形式。),判断该数能否被 i 或者 i + 2 整除,如果能,则不是素数,否则就是素数。
  • main 函数中,通过循环遍历0到200之间的每个数,调用 isPrime 函数进行判断,如果是素数就输出。

5. 优化

可以将

    for (int i = 5; i <= std::sqrt(num); i += 6) {
    }

修改为,减少不必要的循环

int sqrtNum = static_cast<int>(std::sqrt(num));
for (int i = 5; i <= sqrtNum; i += 6) {
}

6. 输出

image.png

标签:10,return,200,int,C语言,素数,num,整除,isPrime
From: https://blog.csdn.net/MrHHHHHH/article/details/144070246

相关文章

  • C语言——数组逐元素操作练习
            定义一个能容纳10个元素的整形数组a,从键盘读取9个整数存放到前9个数组元素中。一.        从键盘读取一个整数n和位置p(0<=p<=8),插入n到数组a中,插入位置:下标p。要求插入点及后续的数组元素都要后移动。    代码如下:intmain(){ intarr......
  • C语言函数递归经典题型——汉诺塔问题
    一.汉诺塔问题介绍        Hanoi(汉诺)塔问题。古代有一个梵塔,塔内有3个座A、B、C,开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个老和尚想把这64个盘子从A座移到C座,但规定每次只允许移动一个盘,且在移动过程中在3个座上都始终保持大盘在下,小盘在上。在移动过程......
  • C语言(七)----指针(下)
    深入理解指针(4)字符指针变量#include<stdio.h>intmain(){ charch='h'; char*pch=&ch; printf("%c\n",*pch); *pch='g'; printf("%c\n",*pch); return0;}//结果为://h//g//也可以:#include<stdio.h>int......
  • MySQL原理简介—10.SQL语句和执行计划
    大纲1.什么是执行计划2.执行计划包含哪些内容3.SQL语句和执行计划的总结4.SQL语句使用多个二级索引5.多表关联的SQL语句如何执行6.全表扫描执行计划的成本计算方法7.索引的成本计算方法8.MySQL如何优化执行计划9.explain的参数说明 1.什么是执行计划(1)什么是SQL优化......
  • [题解]P3629 [APIO2010] 巡逻
    P3629[APIO2010]巡逻\(k=1\)时,我们一定贪心选择直径\(d\)的两个端点建立道路,所以答案是\(2\times(n-1)-d+1\)。\(k=2\)时,两条新建的道路恰好形成\(2\)个环,我们通过手玩可以发现一个结论:\(1\)条边恰好被经过\(1\)次,当且仅当它恰好位于\(1\)个环上。\(1\)条边恰好被经过\(2\)......
  • 1030 Travel Plan(dijsktra + dfs/bfs + 回溯)
     题面意思比较清晰,就是优先最短路,同距离取最小花费。1#include<bits/stdc++.h>2usingnamespacestd;3intn,m,s,d;4typedefpair<int,int>pii;5vector<pii>graph[505];6set<pii>min_heap;7intcost[505][505]={0};8vector<bool>v......
  • 学习分享-队列-1(数据结构C语言)
    本章写的是基于链表的队列,通过链表来实现队列的操作一个基于链表的队列(Queue)数据结构,先进先出结构体定义typedefstructNode{intdata;structNode*next;structNode*pre;}Node;定义一个节点(Node)结构体,包含数据(data)、指向下一个节点的指针(next)和指向......
  • C语言学习笔记(持续更新)
    C语言计算机的组成(预备知识)计算机组成计算机:能进行计算和逻辑的设备硬件:组成计算机的各种物理部件(鼠标,键盘)【硬件=电子设备+单片机编程+集成电路+嵌入式系统】软件:计算机中运行的程序和数据【软件=系统软件+应用软件+编程语言+算法和数据结构】计算机的六大部件中......
  • C语言(数据,运算符)
    C语言学习笔记2——数据,运算符变量概念在程序执行过程中其中的值可以被改变的量变量代表内存中具有特定属性的一个存储单元,他是用来存储数据的,也就是存变量的值变量应有个名字,以便于通过名字访问变量举例:#include<stdio.h>intmain(){ //①声明变量并初始化 i......
  • 学习分享-队列-2(数据结构C语言)
    本章通过C++代码使用STL(标准模板库)中的queue类实现了栈的基本操作,包括入队、出队、查看队头元素、判断队列是否为空以及清空队列。导入头文件#include<iostream>#include<queue>//引入队列的头文件usingnamespacestd;创建队列queue<int>q;入队操作q.push(10)......