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

news2024/11/22 18:06:18

什么是素数(也称质数)?和合数相对。
其特点是只能被 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);
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Pytest接口自动化测试进阶

背景 随着Web应用的发展&#xff0c;越来越多的功能需要用户登录才能使用。而在接口测试中&#xff0c;往往需要模拟用户的登录状态来进行测试。一种常见的做法是通过Cookie来维持用户的登录状态。然而&#xff0c;由于Cookie的有效期限制以及网站的安全策略&#xff0c;如何在…

leetcode每日一题第四十六天

递归解法 class Solution { public:int search(vector<int>& nums, int target) {return midsearch(nums,target,0,nums.size()-1);}int midsearch(vector<int>& nums, int target, int low,int high){if(low < high){int mid (lowhigh) / 2;if(nums[…

别让这6个UI设计雷区毁了你的APP!

一款成功的APP不仅仅取决于其功能性&#xff0c;更取决于用户体验&#xff0c;这其中&#xff0c;UI设计又至关重要。优秀的UI设计能够为用户带来直观、愉悦的交互体验&#xff0c;甚至让用户“一见钟情”&#xff0c;从而大大提高产品吸引力。 然而&#xff0c;有很多设计师在…

.NET Framework安装失败的原因及解决方法

.NET Framework安装失败的原因及解决方法 大家好我是艾西&#xff0c;一个做服务器租用的游戏爱好者兼网络架构系统环境问题网络工具人。在我们平时使用PC安装某些程序会出现.NET Framework缺失的提示&#xff0c;那么也会有很多的小伙伴搞不懂什么原因导致的&#xff0c;这个问…

【C++】unordered 系列关联式容器

文章目录 1. unordered 系列关联式容器2. unordered_map2.1 unordered_map 的文档介绍2.2 unordered_map 的接口说明 3. unordered_set4. 在线 OJ 1. unordered 系列关联式容器 在 C 98 中&#xff0c;STL 提供了底层为红黑树结构的一系列关联式容器&#xff0c;在查询时效率可…

C/C++进阶/架构师(后端/音视频/游戏/嵌入式/高性能网络/存储/基础架构/安全)开发学习路线、系统性学习教程

C学习可以划分为几个主要阶段&#xff0c;每个阶段的学习目标和推荐资源都有所不同。下面是一个详细的分阶段学习指南&#xff1a; 入门阶段 学习目标 理解C的基本语法和结构。学习基本数据类型&#xff0c;条件判断&#xff0c;循环等控制结构。掌握函数的使用方法。初步了…

MongoDB副本集部署(windows)

环境准备 本教程演示mongodb4.4 副本集部署&#xff08;一主两从&#xff0c;伪分布式&#xff09; 节点配置主节点localhost:27017从节点1localhost:27018从节点2localhost:27019 每一个节点&#xff08;实例&#xff09;都创建对应的数据文件&#xff08;data&#xff09;…

从零自制docker-9-【管道实现run进程和init进程传参】

文章目录 命令行中输入参数长度过长匿名管道从父进程到子进程传参[]*os.File{}os.NewFile和io.ReadAllexe.LookPathsyscall.Execstrings.Split(msgStr, " ")/bin/ls: cannot access : No such file or directory代码 命令行中输入参数长度过长 用户输入参数过长或包…

acwing2060. 奶牛选美

题目&#xff1a; 代码&#xff1a; //acwing2060. 奶牛选美 #include<iostream> #include<cstring> #include<algorithm> using namespace std; const int N55; const int dx[]{-1,0,1,0},dy[]{0,-1,0,1}; bool st[N][N]; int point[N][N]; char map[N][…

微信小程序中调取小程序实现报错:提示 开发版小程序已过期,请在开发者工具中重新扫码的 解决方案

出现的问题&#xff1a; 解决方法&#xff1a; 将envVersion: develop,开发版切换为正式版 envVersion: release,wx.navigateToMiniProgram({appId:res.data.appId,path: res.data.prePayTn,extraData: {foo: bar,miniProgramOrgId:res.data.miniProgramOrgId,orderId: res.d…

游标的定义和类型

Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 游标的基本概念 游标从字面上理解为游动的光标&#xff0c;可以使用 Excel 表格来想象游标的作用&#xff0c;游标指向每一行&#xff0c;通过游标访问每行数据。 在 Orac…

前端图片详解(最全面、最新)

前言 当我们在做前端性能优化的时候&#xff0c;总是会离不开图片&#xff0c;尤其在首次内容绘制&#xff08;FCP&#xff09;和最大内容绘制 (LCP)中&#xff0c;图片显得格外关键&#xff0c;而我发现关于图片格式的文章&#xff0c;一般不全&#xff0c;或者是偏旧。 所以…

STC89C52学习笔记(十)

STC89C52学习笔记&#xff08;十&#xff09; 综述&#xff1a;本文介绍了DS18B20和单总线协议&#xff0c;以及讲述了如何使用DS18B20测量温度。 一、单总线协议 1.只有一根通讯线&#xff1a;DQ &#xff08;常见的运用单总线的两种设备&#xff1a;DS18B20和DHT11&#…

sectigo ov企业通配符证书

OV通配符SSL证书是Sectigo旗下比较受欢迎的一款数字证书。Sectigo成立时间较长&#xff0c;旗下的数字证书产品可以使用RSA或者ECC等加密算法保护网站传输信息安全&#xff0c;Sectigo旗下的数字证书可以兼容大多数主流浏览器。今天就随SSL盾小编了解Sectigo旗下的OV企业通配符…

10BASE-T1S架构助力车载E/E领域,引领汽车产业迈向智能化新纪元!

汽车架构的发展 如今&#xff0c;汽车已不仅仅满足消费者的代步需求&#xff0c;而是向所谓的ACES&#xff08;Autonomous, Connected, Electrification, Shared Source&#xff09;方向发展&#xff0c;全自动驾驶和网联化将成为最终目标。由此带来的高算力和高数据吞吐量问题…

AR智能眼镜方案_MTK平台安卓主板芯片|光学解决方案

AR眼镜作为一种引人注目的创新产品&#xff0c;其芯片、显示屏和光学方案是决定整机成本和性能的关键因素。在这篇文章中&#xff0c;我们将探讨AR眼镜的关键技术&#xff0c;并介绍一种高性能的AR眼镜方案&#xff0c;旨在为用户带来卓越的体验。 AR眼镜的芯片选型至关重要。一…

tkinter窗口

简单的窗口程序 导入所需的库 from tkinter import * import json 创建一个主窗口 app Tk() 设置窗口大小为 1048x2048 app.geometry(“1048x2048”) 设置窗口背景为灰色 app.configure(bg“gray”) 创建一个 Label 对象&#xff0c;显示 “账号&#xff1a;” 和红色…

算法中的二阶差分

众所周知&#xff0c;在往区间的每一个数都加上一个相同的数k&#xff0c;进行n次后会得到一个新的数列&#xff0c;如果每次加都循环区间挨个数加上k&#xff0c;这样时间复杂度无疑是O(n^2)&#xff0c;很高。这时可以采用一阶差分就可解决&#xff0c;这里默认会一阶差分&am…

【电控笔记7】速度回路+系统延迟

2.3.1速度回路pi控制器设计 Tl:负载转矩

题目:斤斤计较得小Z(蓝桥OJ 2047)

问题描述&#xff1a; 题解&#xff1a; 做法一&#xff08;kmp模板&#xff09;&#xff1a; #include <bits/stdc.h> using namespace std;const int N 1e6 9; char s[N], p[N]; int nex[N];int main() {ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);// p: 子…