输入一个整数n,输出n的约数为质数的数?两个问题n的约数问题和n的质数问题

输入一个整数n,输出n的约数为质数的数?

  • 一.首先解决n的质数的问题
    • (1)枚举法
    • (2)埃氏筛
  • 二.解决n的质数约数问题

一.首先解决n的质数的问题

(1)枚举法

       考虑质数的定义:在大于 1的自然数中,除了 1 和它本身以外不再有其他因数的自然数。因此对于每个数 x,我们可以从小到大枚举 [2,x−1] 中的每个数 y,判断 y是否为 x的因数。但这样判断一个数是否为质数的时间复杂度最差情况下会到 O(n),无法通过所有测试数据。
       就不写代码了

       枚举没有考虑到数与数的关联性,因此难以再继续优化时间复杂度。接下来我们介绍一个常见的算法,该算法由希腊数学家厄拉多塞(Eratosthenes\rm EratosthenesEratosthenes)提出,称为厄拉多塞筛法,简称埃氏筛。

(2)埃氏筛

以下是埃氏筛法的步骤:

1.创建一个大小为 n+1 的布尔数组 is_prime,并将所有元素初始化为 True。数组的索引代表数字,True 表示该数字是质数,False 表示该数字是合数。
2.将 is_prime[0] 和 is_prime[1] 设置为 False,因为 0 和 1 不是质数。
3.从索引 2 开始,遍历数组。如果当前索引 i 是质数(即 is_prime[i] 为 True),则将所有 i 的倍数(从 i^2开始,小于等于 n)标记为 False,表示这些数不是质数。
4.遍历完成后,所有 is_prime 数组中值为 True 的索引即为小于等于 n 的质数。

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>// 函数声明
void sieve_of_eratosthenes(int n);int main() {int n = 30;printf("小于等于 %d 的质数:\n", n);sieve_of_eratosthenes(n);return 0;
}// 实现埃拉托色尼筛法
void sieve_of_eratosthenes(int n) {// 动态分配一个布尔数组,并初始化为 truebool *is_prime = (bool*) malloc((n + 1) * sizeof(bool));for (int i = 0; i <= n; i++) {is_prime[i] = true;}is_prime[0] = is_prime[1] = false; // 0 和 1 不是质数for (int p = 2; p * p <= n; p++) {// 如果 is_prime[p] 没有被标记为 false,则 p 是一个质数if (is_prime[p] == true) {// 将所有 p 的倍数标记为 falsefor (int i = p * p; i <= n; i += p) {is_prime[i] = false;}}}// 打印所有的质数for (int p = 2; p <= n; p++) {if (is_prime[p]) {printf("%d ", p);}}printf("\n");// 释放动态分配的内存free(is_prime);
}

二.解决n的质数约数问题

要找出一个整数 n 的所有质数约数,我们可以通过以下步骤实现:

1.使用埃拉托色尼筛法生成小于等于 n 的所有质数。
2.遍历这些质数,检查它们是否是 n 的约数。
3.输出所有质数约数。

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>// 函数声明
void sieve_of_eratosthenes(int n, bool* is_prime);
void print_prime_factors(int n, bool* is_prime);int main() {int n;printf("请输入一个整数: ");scanf("%d", &n);// 动态分配一个布尔数组,用于存储质数信息bool *is_prime = (bool*) malloc((n + 1) * sizeof(bool));sieve_of_eratosthenes(n, is_prime);printf("%d 的质数约数是: ", n);print_prime_factors(n, is_prime);// 释放动态分配的内存free(is_prime);return 0;
}// 实现埃拉托色尼筛法
void sieve_of_eratosthenes(int n, bool* is_prime) {for (int i = 0; i <= n; i++) {is_prime[i] = true;}is_prime[0] = is_prime[1] = false; // 0 和 1 不是质数for (int p = 2; p * p <= n; p++) {if (is_prime[p] == true) {for (int i = p * p; i <= n; i += p) {is_prime[i] = false;}}}
}// 打印 n 的质数约数
void print_prime_factors(int n, bool* is_prime) {for (int i = 2; i <= n; i++) {if (is_prime[i] && n % i == 0) {printf("%d ", i);}}printf("\n");
}

代码解析:
1.使用 sieve_of_eratosthenes 函数生成小于等于 n 的所有质数,并将结果存储在布尔数组 is_prime 中。
2.使用 print_prime_factors 函数遍历所有小于等于 n 的数,如果该数是质数且是 n 的约数,则将其打印出来。
3.在 main 函数中,输入一个整数 n,并调用上述两个函数来生成质数并打印质数约数。

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

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

相关文章

conda中创建环境并安装tensorflow1版本

conda中创建环境并安装tensorflow1版本 一、背景二、命令三、验证一下 一、背景 最近需要使用tensorflow1版本的&#xff0c;发个记录&#xff01; 二、命令 conda create -n tf python3.6 #创建tensorflow虚拟环境 activate tf #激活环境&#xff0c;每次使用的时候都…

理解策略梯度方法:从REINFORCE到PPO

今年2月的时候&#xff0c;导师突然告诉我Ron William离世了。他算是我导师的 a life time friend&#xff0c;关系很好&#xff0c;我做毕业论文的时候&#xff0c;他还来参与了论文的答辩。Ron是一个很友善的老头&#xff0c;和他在强化学习领域的影响力比起来&#xff0c;本…

汽车信息安全--数据安全:图像脱敏

General 随着车联网的发展&#xff0c;汽车越来越智能化&#xff0c;就像是一部“装着四个轮子的手机”。 有人说&#xff0c;智能手机就如同一部窃听器&#xff0c;无论你开机或者关机&#xff0c;它都会无时不刻地监听着用户的一举一动。 可想而知&#xff0c;智能车辆上…

马工程刑法期末复习笔记重点2

马工程刑法期末复习笔记重点2

SpringBoot 参数校验

参数校验 引入springvalidation依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId> </dependency>参数前添加Pattern public Result registry(Pattern(regexp &qu…

Java面向对象练习(2.商品类)(2024.7.4)

商品类 package Supermarket20240704;public class Commodity {private String name;private double price;private int inventory;public Commodity(){};public Commodity(String name, double price, int inventory){this.name name;this.price price;this.inventory inv…

Java核心技术【十九】Iterator与增强for循环

Java中的Iterator与增强for循环 在Java编程中&#xff0c;迭代是处理集合元素的一种常见操作。Java提供了多种迭代集合元素的方式&#xff0c;其中最常用的两种是Iterator和增强for循环&#xff08;也称为“for-each”循环&#xff09;。本文将深入探讨这两种迭代方式的特性和…

CLAM用于弱监督WSI分析

计算病理学&#xff08;computational pathology&#xff09;下的深度学习方法需要手动注释大型 WSI 数据集&#xff0c;并且通常存在领域适应性和可解释性较差的问题。作者报告了一种可解释的弱监督深度学习方法&#xff0c;只需要WSI级标签。将该方法命名为聚类约束注意力多实…

Perl 格式化输出:提升代码可读性的技巧

引言 Perl 是一种功能强大的脚本语言&#xff0c;广泛用于文本处理、系统管理、网络编程等多个领域。在 Perl 编程中&#xff0c;代码的格式化输出不仅有助于提升代码的可读性&#xff0c;还能增强程序的用户体验。本文将详细介绍如何在 Perl 中实现代码的格式化输出。 Perl …

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(二十一)

课程地址&#xff1a; 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程&#xff0c;一套精通鸿蒙应用开发 &#xff08;本篇笔记对应课程第 31 节&#xff09; P31《30.数据持久化-关系型数据库》 上一节中学习了使用用户首选项的方式实现数据持久化&#xff0c;但用户首…

微机原理 选择题

D C MOV、PUSH、POP、XLAT&#xff08;查表&#xff09;、IN、OUT不影响标志位 D B D C D C D B 1. (单选题, 5分)8位无符号数(字节)表示的数值范围是( ), 16位无符号数(字)表示的数值范围是( )。 A. 0~128 0~32768B. 0~255 0~655…

为什么 npm run serve 正常,npm run build 就报错:digital envelope routines::unsupported

这个错误通常与 Node.js 版本和使用的加密算法有关。让我解释一下原因和可能的解决方案&#xff1a; 错误原因 这个错误&#xff08;“error:0308010C:digital envelope routines::unsupported”&#xff09;通常发生在以下情况&#xff1a; 使用较新版本的 Node.js&#xf…

Vscode快捷键崩溃

Vscode快捷键崩溃 Linux虚拟机下使用vscode写代码【ctrlA&#xff0c;CtrlC&#xff0c;CtrlV】等快捷键都不能使用&#xff0c;还会出现“NO text insert“等抽象的指令&#xff0c;问题就是不知道什么时候装了一个VIM插件&#xff0c;让他滚出电脑》》》

监听 web 容器内的网络请求(错误的方案)

需求 iOS 项目中 wkwebview 实现的 web 容器&#xff0c;需要监听 web 容器内的所有网络请求 实现 在 iOS 项目中使用 WKWebView 实现的 Web 容器&#xff0c;监听 Web 容器内的网络请求是一个常见需求。可以通过实现 WKURLSchemeHandler 协议来处理自定义的 URL scheme&#…

通过 API 接口管理 Kafka

文章目录 前言Topic 管理配置管理消费者群组管理查看消费者群组修改消费者群组 为主题添加分区从主题中删除消息首领选举 前言 除了通过命令行和可视化界面对 kafka 进行管理&#xff0c;也可以通过 AdminClient的 API 对 kafka 进行管理。本文将介绍如何通过 AdminClient 进行…

[Vue学习]生命周期及其各阶段举例

当我们运行vue项目&#xff0c;看到了屏幕上显示的界面&#xff0c;看到了界面上显示的数据和标签&#xff0c;之后将这个界面叉掉&#xff0c;这一过程其实经历了一整个vue的生命周期的四个阶段&#xff0c;即创建阶段、挂载阶段、更新阶段以及销毁阶段, 而对于每个阶段的启动…

使用 pyecharts 渲染成图片程序报错: echarts is not defined问题处理

背景 之前写的使用 snapshot_selenium 来保存pyeacharts渲染成的网页截图&#xff0c;可以正常运行。程序搁置了半年&#xff0c;不知道动了电脑哪里&#xff0c;再次运行程序时&#xff0c;程序开始报错&#xff1a;JavascriptException: javascript error: echarts is not d…

【SQL】已解决:SQL分组去重并合并相同数据

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;SQL分组去重并合并相同数据 在数据库操作中&#xff0c;数据的分组、去重以及合并是常见需求。然而&#xff0c;初学者在编写SQL语句时&#xff0c;可能会遇到一…

正弦波与单位圆关系的可视化 包括源码

正弦波与单位圆关系的可视化 包括源码 flyfish 正弦波与单位圆的关系 正弦波可以通过单位圆上的点在直线&#xff08;通常是 y 轴&#xff09;上的投影来表示。具体来说&#xff0c;考虑一个单位圆&#xff0c;其半径为 1&#xff0c;圆心在原点。我们可以通过旋转一个角度 …

每日一道算法题 判断子序列

题目 判断子序列_牛客题霸_牛客网 (nowcoder.com) Python # # 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可 # # # param S string字符串 # param T string字符串 # return bool布尔型 # class Solution:def isSubseq…