C语言基础:回顾判断素数

什么是素数(也称质数)?和合数相对。
其特点是只能被 1 和它本身 整除,无法被其他整数整除。或者公因数只有它自己和1两个数的数
在这里插入图片描述

怎么求解素数呢?对于求解质数的方法很多,但是有一种专门求解素数的功能:埃拉托色尼筛选法-这个程序简直就是为求解素数而生。
埃拉托色尼筛选法:埃拉托色尼筛选法(Sieve of Eratosthenes)是一个用来找出一定范围内所有素数的经典算法。这个算法是由古希腊数学家埃拉托色尼发明的。对于C语言实现的描述是:如果自然数i为素数,则设a[i]为1,否则设为0。首先把数组中所有的元素设为1,以表明这些数全部是素数。然后把数组中所有对应的索引处已证明是非素数(一直是素数的倍数)的元素设为0。如果所有的更小的素数的倍数都已经设为0,a[i]仍然为1,则可知它是素数。

我们先从一定范围内N(N=1000)的素数开始,先写一个埃拉托色尼,然后将它打印出来:

#include<stdio.h>
#define N 1000

int main(){
	int i,j,a[N];
	for(i = 2; i < N; i++) a[i] = 1;
	for(i = 2; i < N; i++)
		if(a[i])
			for(j = i; j*i < N; j++) a[j*i] = 0;
	for(i = 2; i < N; i++)
		if(a[i]) printf("%4d",i);
	printf("\n");
}

在这里插入图片描述
注意到这个式子没有问题后,我们着手去实现题目3条:

  • 现在通过 scanf() 函数接收一个正整数 n,判断它是否是质数:
  • 若 n 是质数,通过输出语句输出 [n] is a prime number.
  • 否则,输出 [n] is not a prime number.

前一条非常容易实现:

int num;
scanf("%d",&num);

后两条是两个选择,而且我们通过埃拉托色尼已经将数组中数标记为2类数字了,第一类是值为1的质数,第二类是值为0的合数。
这里我们有两种选择:

  • 第一:使用if else;
	i = num;
	if(a[i]){
		printf("%d is a prime number.",i);
	}else{
		printf("%d is not a prime number.",i);
	}
  • 第二:选择switch(我用的是这个)
    i = num;
    switch(a[i]){
    	case 1:printf("%d is a prime number.",i);break;
    	case 0:printf("%d is not a prime number.",i);break;
    }    

注意:我在这里犯了一个错误,那就是误以为是我们输入的数字和数组里面存储的元素比,但不是,这个里我们是和数组元素的索引比较。

完整代码如下:

#include <stdio.h>
#include <stdio.h>
#define N 1000

int main() {
    // 初始化变量
    // Write your code here
    int i,j,a[N],num;

    // 读取用户输入的数
    scanf("%d",&num);

    // 初始化数组,将所有位置都设为1
    for(i = 2; i < N; i++) a[i] = 1;

    // 遍历数组,标记非质数位置为0
    for(i = 2; i < N; i++)
        if (a[i]) 
            for(j = i; i*j < N; j++) a[i*j] = 0;

    // 判断输入数是否为质数,并输出结果
    i = num;
    switch(a[i]){
    	case 1:printf("%d is a prime number.",i);break;
    	case 0:printf("%d is not a prime number.",i);break;
    }    
}

我们测试一下:分别输入4、5(最大能测试999,因为数组下标是从0开始的,数组长度为1000,a[2]~a[999]);
在这里插入图片描述
在这里插入图片描述
但是这个依然不符合题目要求:2<=num<=10^5,只要将N修改到100000就超时了。
数据类型的范围点击跳转
在这里插入图片描述

理论上随着要求数据的增大只要修改N的值兼顾i,j,a[i]的数据类型就可以了,但是那将需要太多的内存(例如,int a[100000]; 会占用近 4MB 的内存,这在大多数现代系统上是可以接受的,但不是一个好的做法,尤其是如果你打算同时处理多个这样的数组时)。我们需要一个通用的方法,我们需要更加智能的办法。

接下来我们将在埃拉托色尼上加点料,让它更加智能——数组的动态存储分配:通过stdlib.c的库函数malloc,在执行时利用该值为数组动态分配空间。

#include <stdlib.h>
int main(int argc,char *argv[]) {
    long int i,j,N = atol(argv[1]);
    int *a = malloc(N*sizeof(int));
    if (a == NULL)
    	{ printf("Insufficient memory.\n"); return;	}
    

加入之后的代码如下:

#include <stdio.h>
#include <stdlib.h>


int main(int argc,char *argv[]) {
    // 从命令行参数中获取N的值,并将其转换为长整型
    // Write your code here
    long int i,j,N = atol(argv[1]),num;
    // 动态分配一个大小为N的整型数组a
    int *a = malloc(N*sizeof(int));
    // 如果分配失败,则输出错误信息并退出程序
    if (a == NULL)
    	{ printf("Insufficient memory.\n"); return;	}

    // 从标准输入读取一个整数到变量num
    scanf("%d",&num);
    // 将数组a的第2到第N-1个元素都初始化为1
    for(i = 2; i < N; i++) a[i] = 1;
    // 遍历数组a的第2到第N-1个元素
    for(i = 2; i < N; i++)
        // 如果当前元素为1
        if (a[i]) 
            // 则将数组a中从i开始,以i为公倍数的元素都置为0
            for(j = i; i*j < N; j++) a[i*j] = 0;

    // 将变量num的值赋给i
    i = num;
    // 根据数组a中i位置的值判断num是否为质数,并输出相应的结果
    switch(a[i]){
    	case 1:printf("%d is a prime number.",i);break;
    	case 0:printf("%d is not a prime number.",i);break;
    } 
    // 程序结束,返回0
	return 0;   
}

测试之后结果超时了
在这里插入图片描述
哈哈哈,炫酷了一把,结果还是没有解决,但这种思考让我收获匪浅,留一个悬念,有时间了再研究研究,今天就到这里。
下面有个写得不错的,代码如下:

#include <stdio.h>

/**
 * @brief 判断一个整数是否为质数
 *
 * 读取用户输入的整数,判断该整数是否为质数,并输出相应的结果。
 *
 * @return 程序执行状态码,0 表示执行成功,其他值表示执行失败
 */
int main() {
    // 定义一个整数变量num
    // Write your code here
    int num;
    // 定义一个整数变量isPrime,用于表示是否为质数,初始值为1(是质数)
    int isPrime = 1;
    // 从标准输入读取一个整数赋值给变量num
    scanf("%d",&num);
    // 如果num等于1
    if(num==1){
        // 输出1是质数
        printf("%d is a prime number.\n",num);
    }
    // 从2开始循环到num-1
    for(int i=2;i<num;i++){
        // 如果num能够被i整除
        if(num%i==0){
            // 输出num不是质数
            printf("%d is not a prime number.\n",num);
            // 将isPrime设置为0,表示num不是质数
            isPrime = 0;
            // 跳出循环
            break;
        }
    }
    // 如果isPrime仍然为1,即num是质数
    if(isPrime){
        // 输出num是质数
        printf("%d is a prime number.\n",num);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/538259.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Harmony鸿蒙南向外设驱动开发-Camera

功能简介 OpenHarmony相机驱动框架模型对上实现相机HDI&#xff08;Hardware Device Interface&#xff09;接口&#xff0c;对下实现相机Pipeline模型&#xff0c;管理相机各个硬件设备。 该驱动框架模型内部分为三层&#xff0c;依次为HDI实现层、框架层和设备适配层。各层基…

python--对象序列化和反序列化以及with语句块的使用

1.对象序列化和反序列化 对象序列化&#xff1a;将对象这种抽象概念转化为可以传输存储的物理概念 对象反序列化&#xff1a;将磁盘或者网络间的物理数据转化为对应的编程语言的对象 对象持久化&#xff1a;将对象永久的存储下来 对相反持久化&#xff1a; 将磁盘上永久存储…

Spring启动流程和循环依赖

文章目录 概览对Spring的理解Spring启动流程Spring循环依赖与三级缓存 概览 Spring是一个轻量级的Java开源框架&#xff0c;为了解决企业应用开发的复杂性而创建的。Spring的核心是控制反转&#xff08;IOC&#xff09;和面向切面&#xff08;AOP&#xff09;。 简单来说&…

性能优化 - 你知道CSS有哪些优化方案吗

难度级别:中高级及以上 提问概率:70% CSS是前端开发工作中必不可少的技能之一,同时也是网页开发中必不可少的重要元素之一。但很多人所开发的项目本身对性能要求并不高,再加上项目周期紧张,久而久之,也就容易养成不考虑细节的习惯,觉得C…

从0开始创建单链表

前言 这次我来为大家讲解链表&#xff0c;首先我们来理解一下什么是单链表&#xff0c;我们可以将单链表想象成火车 每一节车厢装着货物和连接下一个车厢的链子&#xff0c;单链表也是如此&#xff0c;它是将一个又一个的数据封装到节点上&#xff0c;节点里不仅包含着数据&…

NzN的数据结构--二叉树part2

上一章我们介绍了二叉树入门的一些内容&#xff0c;本章我们就要正式开始学习二叉树的实现方法&#xff0c;先三连后看是好习惯&#xff01;&#xff01;&#xff01; 目录 一、二叉树的顺序结构及实现 1. 二叉树的顺序结构 2. 堆的概念及结构 3. 堆的实现 3.1 堆的创建 …

90天玩转Python—10—基础知识篇:函数详解

90天玩转Python系列文章目录 90天玩转Python—01—基础知识篇:C站最全Python标准库总结 90天玩转Python--02--基础知识篇:初识Python与PyCharm 90天玩转Python—03—基础知识篇:Python和PyCharm(语言特点、学习方法、工具安装) 90天玩转Python—04—基础知识篇:Pytho…

循环单链表算法库

学习贺老师数据结构 数据结构之自建算法库——循环单链表_循环单链表 csdn-CSDN博客​​​​​​ 整理总结出的循环单链表算法库 v1.0 : 基本实现功能 v2.0(2024.4.6): 修复Delete_SpecificLocate_CyclicList()删除节点函数bug,添加验证删除节点是否超范围判断 目录 1.主要功能…

Blender2.83 下载地址及安装教程

Blender是一款开源的3D计算机图形软件&#xff0c;广泛应用于动画制作、游戏开发、建模、渲染等领域。它提供了一套强大的工具和功能&#xff0c;让用户能够进行三维建模、动画制作和视觉效果的创作。 Blender支持多种文件格式的导入和导出&#xff0c;使用户能够与其他软件进…

【Linux源码学习】(一)源码下载、解压说明

目录 一、Linux源码下载地址 二、使用7z解压 一、Linux源码下载地址 官网下载&#xff1a;The Linux Kernel Archives 我们可以到这个地址下载各种版本的压缩包&#xff1a;即上图对应的http网址。 Index of /pub/ 选择Linux 找内核代码 这里直接选择最新的6.x 然后往下翻&…

《猎灵online》游戏完整源码(源码+客户端+服务端+文档+工具),云盘下载

《猎灵》是一款由国内知名开发运营开发的大型3D魔幻网游&#xff0c;《猎灵》研发团队突破诸多瓶颈&#xff0c;首创“全自由无限制PK”&#xff0c;让玩家拒绝无意义等待&#xff0c;自由作战不受任何束缚&#xff0c;真正的实现想战就战&#xff0c;游戏创建了六界神魔乱斗的…

单调栈用法

文章目录 1. 单调栈1.1 理解单调栈&#xff08;模板&#xff09;1.2 每日温度1.3 子数组的最小值之和1.4 柱状图中最大的矩形1.5 最大矩形1.6 最大宽度坡1.7 去除重复字母 1. 单调栈 单调栈经典的用法&#xff1a; 对每个位置都求&#xff1a; 当前位置的左侧比当前位置的数…

UDP网络程序

上一章中&#xff0c;我们介绍了socket&#xff0c;以及TCP/UDP协议。这一章带大家实现几个UDP协议的网络服务。我们需要一个 服务端和一个客户端。 1.服务端实现 1.1socket函数 #include <sys/types.h> #include <sys/socket.h>int socket(int domain, in…

【JAVA基础篇教学】第六篇:Java异常处理

博主打算从0-1讲解下java基础教学&#xff0c;今天教学第五篇&#xff1a; Java异常处理。 异常处理是Java编程中重要的一部分&#xff0c;它允许开发人员在程序运行时检测和处理各种错误情况&#xff0c;以保证程序的稳定性和可靠性。在Java中&#xff0c;异常被表示为对象&am…

【 书生·浦语大模型实战营】作业(三):“茴香豆” 搭建你的RAG 智能助理

【 书生浦语大模型实战营】学习笔记&#xff08;三&#xff09;&#xff1a;“茴香豆” 搭建你的RAG 智能助理作业 &#x1f389;AI学习星球推荐&#xff1a; GoAI的学习社区 知识星球是一个致力于提供《机器学习 | 深度学习 | CV | NLP | 大模型 | 多模态 | AIGC 》各个最新AI…

JVM参数列表

-client :设置JVM使用client模式,特点启动较快(神机不明显(I5/8G/SSD)) -server :设置JVM使用server模式。64位JDK默认启动该模式 -agentlib:libname[options] :用于加载本地的lib -agentlib:hprof :用于获取JVM的运行情况 -agentpath:pathnamep[options] :加载制定路径的本…

PHP01——php快速入门 之 使用phpstudy快速搭建PHP环境

PHP01——php快速入门 之 使用phpstudy快速搭建PHP环境 0. 前言1. 下载小皮面板1.1 下载phpstudy&#xff08;小皮面板&#xff09;1.2 启动、简单访问1.2.1 启动Apache1.2.2 访问1.2.3 访问自定义文件或页面 2. 创建网站2.1 创建网站2.2 可能遇到的问题2.2.1 hosts权限问题&am…

极海APM32电机驱动板记录(二)

文章目录 1、解除写保护2、极海驱动板资源概述3、新建工程4、点灯5、嘀嗒定时器6、中断7、串口打印8、adc读取9、i2c尝试10、定时器测试11、电机驱动pwm测试 上一篇文章算是简单了解了一下极海的板子开发环境吧&#xff0c;结果前几天板子来了&#xff0c;然后发现一个大bug&am…

力扣题目 19:删除链表的倒数第N个节点 【python】

&#x1f464;作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python 欢迎加入社区&#xff1a; 码上找工作http://t.csdnimg.cn/Q59WX 作者专栏每日更新&#xff1a; LeetCod…

Qt-绘制多边形、椭圆、多条直线

1、说明 所有的绘图操作是在绘图事件中进行。mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACEclass MainWindow : public QMainWindow {Q_OBJECTpublic:MainWi…