【C语言】素数的N种代码形式

 The words written in front

大家好,我是xiaoxie,希望你看完之后对你能有所帮助,不足之处,请批评指正!

希望可以和大家一起交流学习进步!

Introduction

大家都知道:“质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数,那如果我们想知道1--200之间的素数是什么,那该如何用C语言去解决这个问题呢。

算法介绍------试除法

试除法是一种简单而直观的质数判定方法。其基本思想是:对于正整数n,若n能被2到n-1之间的任一整数整除,则n非质数;否则,n为质数。

以下是基于试除法算法的C语言实现:

​
#include<stdio.h>
#include<math.h>
int main()
{
	int n = 0;
	int count1 = 0;//计算素数个数
	for (n = 100; n <= 200; n++)
	{
		
		int j = 0;
		for (j = 2; j <n; j++)
		{
			if (n % j == 0)//说明有除n和n本身的其他数整除,说明i不是素数
				break;
		}
			if (j ==n)//说明2到n-1中没有n的因子
			{
				printf("%d\n", n);
				count1++;
			}
			

	}printf("\ncount1=%d", count1);
	return 0;

}

​

要想知道上面的时间复杂度,我们可以看它到底for循环了几次。我们可以对上述的代码增加一个对循环次数的监视,这样就可以直观的了解这段代码高不高效

代码实现如下:

#include<stdio.h>
#include<math.h>
int main()
{
	int n = 0;
	int count1 = 0;//计算素数个数
	int count2 = 0;//计算循环次数
	for (n = 100; n <= 200; n++)
	{
		
		int j = 0;
		for (j = 2; j <n; j++)
		{
			count2++;
			if (n % j == 0)//说明有除n和n本身的其他数整除,说明i不是素数
				break;
		}
			if (j ==n)//说明2到n-1中没有n的因子
			{
				printf("%d\n", n);
				count1++;
			}
			

	}printf("\ncount1=%d", count1);
	printf("\ncount2=%d", count2);
	return 0;

}

由此我们可以得出这段代码仅仅只是100个数就循环了3292次,而我们判断一个算法是否优劣是看它是否高效,执行效率是否高效。所以我们应该对它做出优化。

试除法优化版--开平方

n=a*b,例如16=2*8=4*4,意味着a和b中至少有一个数字<=开平方n,如果在开平方之前仍未找到能整除i的数,就不可能再找到其他的数整除i,则该数为素数.以下是代码实现:

#include<stdio.h>
#include<math.h>
int main()
{
	int n = 0;
	int count1 = 0;//计算素数个数
	int count2 = 0;//计算循环次数
	for (n = 100; n <= 200; n++)
	{
		int j = 0;
		for (j = 2; j <= sqrt(n); j++)//使用sqrt库函数要引用#include<math.h>
		{
			count2++;
			if (n % j == 0)//说明有除n和n本身的其他数整除,说明i不是素数
				break;
		}
			if (j>sqrt(n))//说明2到根号n中没有n的因子
			{
				printf("%d\n", n);
				count1++;
			}
			

	}printf("\ncount1=%d", count1);
	printf("\ncount2=%d", count2);
	return 0;

}

由上述代码我们大大的优化算法的执行效率,减少了程序实现功能的时间。

试除法优化版--去偶数

由素数定义我们可知素数只能被1和它本身整除那么只要n为偶数就一定不是素数,由此我们就可以从源头排除一些数。以下是代码实现:

#include<stdio.h>
#include<math.h>
int main()
{
	int n = 0;
	int count1 = 0;//计算素数个数
	int count2 = 0;//计算循环次数
	for (n = 100; n <= 200; n++)
	{
		if (n % 2 == 0)//判断n是否为偶数
		{
			
			continue;
		}
		int j = 0;
		for (j = 2; j <= sqrt(n); j++)//使用sqrt库函数要引用#include<math.h>
		{
			count2++;
			if (n % j == 0)//说明有除n和n本身的其他数整除,说明i不是素数
				break;
		}
			if (j>sqrt(n))//说明2到根号n中没有n的因子
			{
				printf("%d\n", n);
				count1++;
			}
			

	}printf("\ncount1=%d", count1);
	printf("\ncount2=%d", count2);
	return 0;

}

由此可见count2=342,只循环了342,又减少了程序实现功能的时间,提高了效率。所以博主强烈的建议大家掌握这个方法。这样你和其他的人做一道题时,直接就和其他人拉开了差距。那么判断素数就一种算法了嘛,接下来博主再为大家介绍一种算法

埃拉托色尼筛选法

有些时候,除了检验给定整数x是否为质数的函数之外,如果能事先准备出质数数列或质数表,就可以帮助我们更有效地求解质数的相关问题。
埃拉托色尼筛选法(The Sieve of Eratosthenes)可以快速列举出给定范围内的所有质数,这个算法如下步骤生成质数表。
埃拉托色尼筛选法

  1. 列举大于等于2的整数。
  2. 留下最小的整数2,删除所有2的倍数。
  3. 在剩下的整数中留下最小的3,删除所有3的倍数。
  4. 在剩下的整数中留下最小的5,删除所有5的倍数。
  5. 以下同理,留下仍未被删除的最小整数,删除该整数的倍数,一直循环到结束。

以最小的4个质数为例,其求解过程如图。
原始表:

第一轮:第二轮:

第三轮:

第四轮:根据上表提供的思路,我们可以用C语言实现这个算法的应用

代码如下:

​
#include <stdio.h>
#include <stdbool.h>

#define MAX 200

// 判断一个数是否为素数
bool is_prime(int num) {
    if (num < 2) { // 如果一个数小于2,那么它不是素数
        return false;
    }
    for (int i = 2; i * i <= num; i++) { // 遍历2到num的平方根
        if (num % i == 0) { 
            // 如果num能被i整除,那么它不是素数
            return false;
        }
    }
    return true; // 如果num不能被2到它的平方根之间的任何数整除,那么它是素数
}

// 使用埃拉托色尼筛选法找出1到MAX之间的所有素数
void sieve_of_eratosthenes() {
    bool is_prime[MAX + 1]; // 创建一个布尔类型的数组,用于存储1到MAX之间的所有数是否为素数
    for (int i = 2; i <= MAX; i++) { // 将所有数初始化为素数
        is_prime[i] = true;
    }
    int count = 0; // 记录循环次数
    for (int i = 2; i * i <= MAX; i++) { // 遍历2到MAX的平方根
        if (is_prime[i]) { // 如果i是素数
            for (int j = i * i; j <= MAX; j += i) { // 将i的所有倍数标记为非素数
                is_prime[j] = false;
            }
            count++; // 执行了一个完整的循环
        }
    }
    printf("循环次数: %d\n", count); // 打印循环次数
    for (int i = 2; i <= MAX; i++) { // 打印所有素数
        if (is_prime[i]) {
            printf("%d ", i);
        }
    }
}

// 主函数
int main() {
    sieve_of_eratosthenes();
    return 0;
}

​

埃拉托色尼筛选法需要占用一部分内存空间(与待检验整数的最大值N成正比),但其复杂度只有O(N log log N)。

总结

素数还有很多种算法可以求解,有句老话叫做”活到老学到老“,C语言更是一门需要不断学习,不断设计出更优解的语言,希望这篇文章可以帮助你对C语言的学习提供一点帮助,不足之处,请多多谅解,让我们一起共同学习共同成长。

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

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

相关文章

ECharts实现简单饼图和柱状图

1.JAVA 1.饼图 前端使用vue&#xff0c;后端使用SpringBoot <template><div><div class"card" style"padding: 15px">数据可视化分析&#xff1a;图书类型销量</div><div style"display: flex; margin: 10px 0"&g…

Github 2024-01-21 开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2024-01-21统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目7Cuda项目1HTML项目1Jupyter Notebook项目1非开发语言项目1 高级英语学习指南 创建周期&#xff…

Oracle1 数据库管理

Oracle的安装 一、基础表的创建 1.1 切换到scott用户 用sys 账户 登录 解锁scott账户 alter user scott account unlock;conn scott/tiger;发现并不存在scott账户&#xff0c;自己创建一个&#xff1f; 查找资料后发现&#xff0c;scott用户的脚本需要自己执行一下 C:\ap…

【Fooocus 深度学习】SDXL,AIGC生图,源码解读

文章目录 使用通配符增加prompt多样性Fooocus的风格实现 使用通配符增加prompt多样性 prompt和negative_prompt都可以通过apply_wildcards函数来实现通配符替换&#xff0c;apply_wildcards会从txt中随机找一个出来。 promptsunshine, river, trees, __artist__ task_prompt …

Adobe Acrobat DC软件安装后右键菜单点击无反应报错解决办法

安装了Adobe Acrobat DC软件后&#xff0c;Adobe Acrobat DC软件会修改系统的右键菜单&#xff0c;如果一旦Adobe Acrobat DC软件出现问题&#xff0c;你的右键菜单也就不能使用了&#xff0c;出现未响应的状态。 那如何恢复系统原来的右键菜单呢&#xff0c;办法很简单&#x…

在线海报图片设计器、图片编辑器源码/仿照稿定设计源码

在线海报设计系统素材设计源码是一个漂亮且功能强大的在线海报图片设计器&#xff0c;仿照稿定设计而成。该系统适用于多种场景&#xff0c;包括海报图片生成、电商分享图、文章长图、视频/公众号封面等。用户无需下载软件&#xff0c;即可轻松实现创意&#xff0c;迅速完成排版…

全网诚招工程项目管理平台城市合伙人

我们需要全力打造适用于建筑装饰、机电安装、光伏、钢结构工程项目的项目管理平台&#xff1b;专门针对建筑施工企业&#xff0c;为施工企业提升数字化工程管理水平&#xff0c;提升施工管理效率&#xff0c;节约成本&#xff0c;控制施工过程风险&#xff0c;严格管理施工过程…

arcgis实现截图/截屏功能

arcgis实现截图/截屏功能 文章目录 arcgis实现截图/截屏功能前言效果展示相关代码 前言 本篇将使用arcgis实现截图/截屏功能&#xff0c;类似于qq截图 效果展示 相关代码 <!DOCTYPE html> <html> <head><meta charset"utf-8"><meta nam…

289. 生命游戏

根据 百度百科 &#xff0c; 生命游戏 &#xff0c;简称为 生命 &#xff0c;是英国数学家约翰何顿康威在 1970 年发明的细胞自动机。 给定一个包含 m n 个格子的面板&#xff0c;每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态&#xff1a; 1 即为 活细胞 &am…

嵌入式工程师有什么推荐学习路径?

嵌入式工程师有什么推荐学习路径&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff…

阿赵UE学习笔记——12、植物系统

阿赵UE学习笔记目录 大家好&#xff0c;我是阿赵。   继续学习虚幻引擎的用法。这次需要使用植物系统在地形上添加一些草和石头的装饰。 一、素材准备 之前介绍过&#xff0c;可以在Quixel上面获取免费的资源&#xff0c;所以我这里就下载了一些资源&#xff0c;有草和石头的…

MySQL(下)

四、事务 一、概念 对数据库的一次执行中有多条sql语句执行。这多条sql在一次执行中&#xff0c;要么都成功执行&#xff0c;要么都不执行。保证了数据完整性。MySQL中只有innodb引擎支持事务。 二、特性 事务是必须满足 4 个条件&#xff08;ACID&#xff09;&#x…

【mongoDB】集合的创建和删除

目录 1.集合的创建 2. 查看所有集合 3.删除集合 1.集合的创建 格式&#xff1a; db.createCollection ( name ) 例如创建一个名为 bbb 的集合 还可以通过传递一个选项对象来指定集合的属性&#xff0c;例如最大文档的大小&#xff0c;索引选项等 例如 这样创建了一个名为 cc…

【业务功能篇133】 Mysql连接串优化性能问题

rewriteBatchedStatementstrue开启了MySQL驱动程序的批量处理功能。 spring.datasource.urljdbc:mysql://localhost:3306/mydatabase?rewriteBatchedStatementstrue 在MyBatis Plus框架中&#xff0c;批量插入是一种高效的数据库操作方式。通过开启rewriteBatchedStatementstr…

在优衣库新衣年货里,看见幸福感的“共振”

一场寒潮自北向南掠过&#xff0c;很多地区迎来瑞雪兆丰年的美好意象&#xff0c;年味渐浓&#xff0c;农历新年进入倒计时状态。带着对新年团聚的期许&#xff0c;置办年货&#xff0c;开始成为老百姓在这个时节的大事。 经历颇具魔幻色彩的2023年&#xff0c;“龙年”对中国…

x-cmd pkg | sqlite3 - 轻量级的嵌入式关系型数据库

目录 简介首次用户 技术特点竞品和相关产品sqlite 与 x-cmd进一步阅读 简介 sqlite3 是一个轻量级的文件数据库&#xff0c;体积非常小&#xff0c;提供简单优雅而功能强大的 sql 化的数据查询。 通常情况下&#xff0c;sqlite 指的是 SQLite 2.x 版本&#xff0c;而 sqlite3 …

Aleo测试网回顾-测试网期间共释放了多少积分

上一篇我们整理了Aleo的详细项目介绍&#xff0c;Aleo项目详细介绍-一个兼顾隐私和可编程性的隐私公链-CSDN博客 接下来&#xff0c;让我们盘点下测试网期间的积分释放情况&#xff0c;测试网期间的奖励积分也将是Aleo主网上线后的抛压来源。测试网期间共计释放了4000万的积分…

MATLAB标记点

% clear % clc % close all % % 生成随机时程信号 % fs100; % signalLength fs*60*2; % time 1/fs:1/fs:signalLength/fs; % randomSignal 2*sin(2*pi*0.5*time)3*cos(2*pi*1*time)randn(1, signalLength); function [frequencyPP]funct_peak(signal,Hz) % 生成随机时…

跨境防诈指南 | 了解美国电商持续遭遇的“超额支付”欺诈

目录 常见的“超额支付”欺诈类型 假支票诈骗 虚假信用卡欺诈 基于交易的洗钱诈骗 防止“超额支付”欺诈 增强交易安全保障 加强异常交易识别 借助反欺诈技术识别 加强团队欺诈培训 美国商业委员会的统计报告显示&#xff0c;2023年年1至6月&#xff0c;联邦贸易委员会&#xf…