Java實戰:尋找完美數

文章目錄

  • 一、何謂完美數
  • 二、尋找完美數
    • (一)編程思路
    • (二)編寫程序
    • (三)運行程序
  • 三、實戰小結

一、何謂完美數

  • 完美數是一種特殊的自然數,它等于其所有正除數(不包括其本身)之和。完美數非常稀有,并且只存在于偶數中。第一個完美數是 6 6 6,其除數 1 1 1 2 2 2 3 3 3的和等于它本身。完美數與梅森素數緊密相關,如果 2 p ? 1 2^p - 1 2p?1是梅森素數,那么 2 p ? 1 ( 2 p ? 1 ) 2^{p-1}(2^p - 1) 2p?1(2p?1)就是完美數。古希臘數學家歐幾里得首次描述了完美數,但直到現代,已知的完美數仍然不多。尋找完美數是數論中一個古老而深奧的問題,至今仍在數學研究中占有一席之地。隨著數值的增大,發現新的完美數變得越來越困難,需要高效的算法和強大的計算資源。
  • 6 = 1 + 2 + 3 6 = 1 + 2 + 3 6=1+2+3是最小的完美數,不僅如此, 6 = 1 × 2 × 3 6 = 1 \times 2 \times 3 6=1×2×3,《圣經》開篇《創世紀》里提到,上帝用6天的時間創造了世界(第 7 7 7天是休息日),而相信地心說的古希臘人認為,月亮圍繞地球旋轉所需的時間是 28 28 28天(即便在哥白尼的眼里,太陽系也恰好有 6 6 6顆行星)。古羅馬思想家圣奧古斯都在《上帝之城》中寫道:“ 6 6 6這個數本身就是完美的,并非因為上帝造物用了 6 6 6天;事實上,恰恰因為 6 6 6是完美的,所以上帝在 6 6 6天之內把一切事物都造好了。”
  • 迄今為止( 2024 2024 2024 7 7 7 9 9 9日),人們只發現51個偶完美數,沒有人找到一個奇完美數,也沒有人能夠否定它的存在。不難證明,偶完美數均以數字 6 6 6 8 8 8結尾。古希臘人曾猜測它們交替以 6 6 6 8 8 8結尾,后來被證實是錯誤的。統計已有的完美數,以 8 8 8結尾的和以 6 6 6結尾的完美數分別是 19 19 19個和 32 32 32個,這個比值趨近于黃金分割比!有意思的是,黃金分割恰好也是畢達哥拉斯學派提出來的,只是他們當初沒想過其與完美數之間可能存在某種聯系。
  • 所謂黃金分割比是指把一條線段分割成兩部分,使其中一部分與全長之比等于另一部分與這部分之比,其比值是 5 ? 1 2 ≈ 0.618 \displaystyle\frac{\sqrt{5}-1}{2}≈0.618 25 ??1?0.618…按此比例設計的造型特別美麗,被稱為黃金分割。這個數值不僅體現在諸如繪畫、雕塑、音樂、建筑等藝術領域,也在管理、工程設計等方面有重要的應用,在日常生活中的應用也比比皆是。

二、尋找完美數

(一)編程思路

  1. 理解完美數與梅森素數的關系:完美數是形式為 2 p ? 1 ( 2 p ? 1 ) 2^{p-1}(2^p - 1) 2p?1(2p?1)的數,其中 2 p ? 1 2^p - 1 2p?1必須是梅森素數。

  2. 實現Lucas-Lehmer素性測試:這是檢測梅森素數的一種有效方法。對于每個 p p p,計算序列直到 p ? 2 p-2 p?2項,如果最終結果為 0 0 0,則 2 p ? 1 2^p - 1 2p?1是素數。

  3. 尋找梅森素數:從 p = 2 p=2 p=2開始,對每個 p p p調用lucasLehmerPrime函數,檢查 2 p ? 1 2^p - 1 2p?1是否為素數。

  4. 計算并輸出完美數:一旦找到梅森素數,根據完美數的公式計算相應的完美數,并輸出結果。

  5. 設置搜索限制:程序將持續尋找并輸出完美數,直到找到大于預設限制的數為止。

  6. 優化與考慮:對于大數計算,使用BigInteger類處理可能的溢出問題。同時,考慮到計算量可能非常大,實際應用中可能需要進一步優化算法或使用并行計算。

  7. 代碼實現:將上述思路轉化為Java代碼,使用BigInteger類進行大數運算,實現完美數的搜索程序。

(二)編寫程序

  • net.huawei.number包里創建PerfectNumberFinder
    在這里插入圖片描述
package net.huawei.number;import java.math.BigInteger;/*** 功能:完美數尋找器* 作者:華衛* 日期:2024年07月09日*/
public class PerfectNumberFinder {public static void main(String[] args) {// 設置尋找完美數的上限findPerfectNumbers(new BigInteger("1000000000000000000000000000000000000000000000000000000000000000000000000000"));}/*** 執行Lucas-Lehmer素性測試來檢查2^p - 1是否為梅森素數。** @param p 用于計算2^p - 1的指數* @return 如果2^p - 1是素數,則返回true,否則返回false*/public static boolean lucasLehmerPrime(int p) {if (p == 2) {return true; // 2^2 - 1是最小的梅森素數}BigInteger s = BigInteger.valueOf(4); // 初始值BigInteger M = BigInteger.ONE.shiftLeft(p).subtract(BigInteger.ONE); // 計算2^p - 1for (int i = 0; i < p - 2; i++) {// 應用Lucas-Lehmer迭代過程s = s.multiply(s).subtract(BigInteger.valueOf(2)).mod(M);}return s.equals(BigInteger.ZERO); // 如果s為0,則2^p - 1是素數}/*** 尋找并打印所有小于給定限制的完美數** @param limit 完美數搜索的上限值*/public static void findPerfectNumbers(BigInteger limit) {int p = 2; // 從最小的梅森素數候選指數開始int count = 0;while (true) {if (lucasLehmerPrime(p)) {// 如果找到梅森素數,計算相應的完美數BigInteger mersennePrime = BigInteger.ONE.shiftLeft(p).subtract(BigInteger.ONE);BigInteger perfectNumber = BigInteger.ONE.shiftLeft(p - 1).multiply(mersennePrime);// 統計找到的完美數數量count++;// 打印梅森素數和對應的完美數System.out.println("梅森素數: " + mersennePrime);System.out.println("完 美 數: " + perfectNumber);// 如果完美數大于給定限制,則停止搜索if (perfectNumber.compareTo(limit) > 0) {break;}}p++; // 移動到下一個候選指數}System.out.println("找到" + count + "個完美數~");}
}

(三)運行程序

  • 查看結果,在指定范圍內找到12個完美數
    在這里插入圖片描述

三、實戰小結

  • 通過編寫和運行完美數尋找器程序,我們深入理解了完美數與梅森素數的內在聯系,體驗了大數計算的挑戰,并認識到了算法優化的重要性。此過程不僅鍛煉了編程技能,還激發了我們對數論奧秘的探索興趣。盡管尋找大完美數極具難度,但使用BigInteger類和Lucas-Lehmer測試,我們能夠有效地識別梅森素數,進而發現新的完美數。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/44351.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/44351.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/44351.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

百問網全志D1h開發板MIPI屏適配

MIPI屏適配 100ASK-D1-H_DualDisplay-DevKit V11 1. 顯示適配 1.1 修改設備樹 1.1.1 修改內核設備樹 進入目錄&#xff1a; cd /home/ubuntu/tina-d1-h/device/config/chips/d1-h/configs/nezha/linux-5.4修改board.dts: &lcd0 {lcd_used <1>;lcd…

類的生命周期詳解

第1部分&#xff1a;引言 1.1 面向對象編程簡介 面向對象編程&#xff08;OOP&#xff09;是一種編程范式&#xff0c;它使用“對象”來設計軟件。對象可以包含數據&#xff08;通常稱為屬性或字段&#xff09;和代碼&#xff08;通常稱為方法或函數&#xff09;。OOP的核心概…

Vue 項目中 history 路由模式的使用

在最近幫客戶開發的一個項目中&#xff0c;由于項目的特殊性&#xff0c;需要用到 Vue 中的 history路由模式。該模式使用時會涉及到“上傳白屏”和“刷新 404 問題”。在幫助客戶解決這兩個問題的過程中&#xff0c;總結問題的解決方案并記錄下來&#xff0c;希望能夠保留這篇…

眼外傷險失明輾轉成都愛爾眼科就醫保視力,患者復查送錦旗!

近日患者王先生到成都愛爾眼科醫院進行硅油取出后的二次復查&#xff08;硅油為眼底病手術中一種“填充物”&#xff09;&#xff0c;他激動地為蔡裕主任獻上錦旗&#xff0c;感謝醫生的救治避免了失明。 意外發生在半年之前&#xff0c;王先生不慎滑倒右眼磕碰到茶幾邊緣&…

【前端從入門到精通:第九課:CSS3新增屬性及伸縮盒布局】

彈性盒模型 介紹 伸縮盒模型也叫彈性盒模型&#xff0c;或flex。它決定一個盒子在其它盒子中的分布&#xff0c;以及如何處理可用的空間。使用該模型&#xff0c;可以輕松的創建“自適應”瀏覽器窗口的流動布局。 flexbox是一個很新的東西&#xff0c;在w3c希望可以使用flexbo…

力扣1472.設計瀏覽器歷史記錄

力扣1472.設計瀏覽器歷史記錄 用雙指針記錄歷史記錄 以及棧頂高度移動時會直接把之前的記錄消掉 class BrowserHistory {int pos-1;int top0;string history[5010];public:BrowserHistory(string homepage) {visit(homepage);}void visit(string url) {pos ;top pos;histor…

[激光原理與應用-103]:配電箱的柜門與柜體為啥要接一根導線?

目錄 一、概述 1.1、電氣安全 1.2、減少電磁干擾 1.3、方便維修和更換 1.4、其他因素 一、鉸鏈的材質 二、鉸鏈的設計 三、結論 二、正確連接銅線的步驟 1、選擇正確的銅線 2、清潔連接處 3、正確連接 4、檢查連接是否牢固 參考&#xff1a; 一、概述 配電機柜上…

探索AI藝術的無限可能:SD模型與大模型的融合之美

藝術與科技的結合從未像今天這樣緊密。AI繪畫技術正以驚人的速度改變著我們創作和欣賞藝術的方式。在這場革命中&#xff0c;Stable Diffusion&#xff08;SD&#xff09;模型扮演了至關重要的角色。 &#x1f31f; SD模型&#xff1a;藝術創作的新維度 SD模型以其生成高質量圖…

力扣682.棒球比賽

力扣682.棒球比賽 數組模擬棧記錄分數 class Solution {public:int calPoints(vector<string>& ops) {int res0;vector<int> points;for(auto &op:ops){int n points.size();char c op[0];if(c ){res points[n-1] points[n-2];points.push_back(po…

在數據庫設計中,選擇自增 ID 還是 GUID?這篇文章講清楚

在數據庫設計中&#xff0c;選擇自增 ID 還是 GUID 取決于具體的應用場景和需求。 自增 ID 的優點&#xff1a; 性能較好&#xff1a;在插入數據時&#xff0c;自增 ID 的生成速度通常較快&#xff0c;因為數據庫可以高效地順序分配新的 ID 值。存儲空間小&#xff1a;通常只…

1.9-改進的CBOW模型的實現

文章目錄 0引言1 CBOW模型的重構1.1模型初始化1.2模型的前向計算1.3模型的反向傳播 2總結 0引言 前面講述了對word2vec高速化的改進&#xff1a; 改進輸入側的計算&#xff0c;變成Embedding&#xff0c;即從權重矩陣中選取特定的行&#xff1b;改進輸出側的計算&#xff0c;包…

Perl中的文件系統守衛:實現自定義訪問控制

&#x1f6e1;? Perl中的文件系統守衛&#xff1a;實現自定義訪問控制 在系統編程中&#xff0c;文件系統訪問控制是確保數據安全和完整性的關鍵機制。Perl作為一種功能強大的腳本語言&#xff0c;提供了豐富的接口來實現自定義的文件系統訪問控制。本文將深入探討如何在Perl…

【C語言】【排序算法】----- 歸并排序

由于最近要考試&#xff0c;好久沒有發博客了&#xff0c;非常抱歉大家對我的支持。之后我會不斷更新博客&#xff0c;繼續創作出高質量的文章&#xff0c;希望能幫到大家&#xff01; 文章目錄 一、歸并排序基本思想二、遞歸實現三、非遞歸實現四、效率分析 一、歸并排序基本…

Foxit Reader:高效、安全、多功能的PDF閱讀器技術解析

引言 在當今數字化時代&#xff0c;PDF&#xff08;Portable Document Format&#xff09;文檔已成為工作、學習和生活中不可或缺的一部分。作為處理PDF文件的重要工具&#xff0c;PDF閱讀器的選擇顯得尤為關鍵。今天&#xff0c;我們將深入探討一款備受推崇的PDF閱讀器——Fo…

KDP數據分析實戰:從0到1完成數據實時采集處理到可視化

智領云自主研發的開源輕量級Kubernetes數據平臺&#xff0c;即Kubernetes Data Platform (簡稱KDP)&#xff0c;能夠為用戶提供在Kubernetes上的一站式云原生數據集成與開發平臺。在最新的v1.1.0版本中&#xff0c;用戶可借助 KDP 平臺上開箱即用的 Airflow、AirByte、Flink、K…

MySQL數據庫中利用定時作業去殺死長時查詢以防止數據庫死鎖風險

MySQL數據庫中沒有SQLServer數據庫中那種傳統的定時作業的概念。但是提供了一種【事件】的東西&#xff0c;基本和定時作業貌離神合。 下面我們在MySQL中創建一個事件&#xff0c;它的作用是去監測時間很長的異常查詢&#xff0c;并且去主動殺掉該線程以防止數據庫發生死鎖的風…

探索Perl的自動清潔工:垃圾收集機制全解析

&#x1f9f9; 探索Perl的自動清潔工&#xff1a;垃圾收集機制全解析 Perl是一種高級編程語言&#xff0c;以其強大的文本處理能力而聞名。在Perl中&#xff0c;內存管理對于開發高效且穩定的應用程序至關重要。Perl提供了自動垃圾收集機制&#xff0c;幫助開發者管理內存&…

關于原型和原型鏈的學習和實踐

在前端面試中&#xff0c;原型和原型鏈始終是一個避不開的問題&#xff0c;今天就弄明白! 原型和原型鏈 對象的創建方式工廠模式構造函數模式原型模式 原型和原型鏈實踐 對象的創建方式 原型和原型鏈都是關于對象的內容&#xff0c;先來看一下JavaScript中對象的構建方式。 工…

代碼隨想錄(day3)有序數組的平方

暴力求解法&#xff1a; 注意&#xff1a;需要確定范圍&#xff0c;比如nums.sort()是在for循環之外&#xff0c;根據函數的功能來確定 return返回的是nums&#xff0c;而不是nums[i]因為返回的是整個數組 class Solution(object):def sortedSquares(self, nums):for i in r…

人話學Python-基礎篇-數字計算

一&#xff1a;數字類型 對于最常見的數據類型,數字在Python中分為三類&#xff1a; 整型(int) 表示的是整數類型的所有數字&#xff0c;包括正整數&#xff0c;負整數和0。和C語言不同的是&#xff0c;Python中的int型沒有范圍的限制&#xff0c;理論上可以從無限小的整數取到…