輸入一個整數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.pswp.cn/diannao/40641.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/40641.shtml
英文地址,請注明出處:http://en.pswp.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…