【演算法】數學之旅,根據素數特征尋找底數

来源:https://www.cnblogs.com/lan80/archive/2023/09/27/17731054.html
-Advertisement-
Play Games

模擬.NET實際應用場景,綜合應用三個主要知識點:一是使用dnSpy反編譯第三庫及調試,二是使用Lib.Harmony庫實現第三庫攔截、偽造,三是實現同一個庫支持多版本同時引用。 ...


當下午六點的鐘聲敲響,小悅如常地結束了一天的工作。她坐在工位上,腦海中不禁回想起自己學習數學的過程。那些數字、公式以及那些漫長夜晚的努力,都像是一段迷人的旋律,讓她無法忘懷。當她沉浸在回憶中時,那迷人的微笑映入了旁人的眼帘,而這一幕恰好被一位同事捕捉到。

“你在笑什麼呢?”同事好奇地問道。

“哦,沒什麼。”小悅笑著回答,“只是想起了一些有趣的數學問題。”

由於等電梯的人太多,小悅便開始回想那些神奇的數字,它們就像是被隱藏在數學世界中的寶藏,讓當時年少的她充滿了好奇與探索的欲望。她一一列舉出那些數字:89、271、325、328...每個數字都像是擁有獨特的秘密。

她深入思考這些數字的特性,嘗試找出它們的規律。她驚奇地發現,這些數字的平方值經過反轉後,居然都是素數。例如,89的平方是7921,反轉後成為1297,這是一個素數;271的平方是73441,反轉後成為14437,同樣也是一個素數...這些看似平凡無奇的數字,經過平方和反轉之後,竟然擁有了素數的特質,這讓她感到無比驚奇。

然而,這還不足以滿足小悅的好奇心。她進一步發現,這些數字的立方值經過反轉後也隱藏著素數的秘密。比如89的立方是704969,反轉後是969407,這是一個素數;271的立方是19902511,反轉後是11520991,也是一個素數...這些原本看似簡單的數字,在經過立方和反轉之後,同樣也擁有了素數的特質。

當時的小悅深深地被這些發現所吸引,她開始思考這些現象背後的原因。她發現這其實是一種數學規律,與素數、數字反轉和數學運算等概念密切關聯。這些概念在數學教學中廣泛應用於數論、算術和代數等方面的練習和學習,讓她對數學有了更深層次的理解和認識。

同時,小悅還意識到這些數學問題的應用不僅僅局限於數學學習和教育。在編程練習中,這些問題也能夠引導學習者加深對迴圈、條件判斷和函數等概念的理解和應用。通過解決這些問題,學習者可以鍛煉編程思維和解決問題的能力。

小悅的思緒還在繼續,她依然沉浸在這種數學世界的探索和發現中,享受著這種無盡的樂趣和挑戰。對她來說,這些神奇的數字就像是一把鑰匙,打開了一扇通向更廣闊數學世界的大門。她期待著未來能夠繼續用這把鑰匙解開更多的數學謎題,探索更多未知的領域。

“數學真是個奇妙的世界啊。”小悅感嘆道,她的眼中閃爍著對數學知識無盡的熱愛和追求。而那個在工位上回想學習數學過程、下意識迷人的微笑的小悅,永遠是同事們心中最美的風景。

小悅面臨的問題是如何將這些特殊的數從數字的海洋中尋找出來:創建一個函數SqCubRevPrime(),它接收數組的序號1,2,3,4,5...並輸出相應的底數值,這些底數應該能滿足平方、立方後反轉的數仍是素數的要求:

SqCubRevPrime(1)==89

SqCubRevPrime(2)==271

SqCubRevPrime(3)==325

SqCubRevPrime(4)==328


演算法實現:

 1 using System;
 2 using System.Collections.Generic;
 3 
 4 public static class Edm {
 5   // 判斷一個無符號長整型數是否為質數(素數)
 6   private static bool IsOddPrime(ulong n) {
 7     // 從3開始,遞增2,直到迴圈變數的平方大於等於給定的數
 8     for (ulong d = 3; d * d <= n; d += 2) {
 9       // 如果給定的數能夠被迴圈變數整除,則返回false,表示不是質數
10       if (n % d == 0) return false;
11     }
12     // 迴圈結束後沒有找到能整除的數,則返回true,表示是質數
13     return true;
14   }
15   
16   // 將一個無符號長整型數進行反轉
17   private static ulong Reverse(ulong n) {
18     ulong r = 0;
19     // 從個位開始依次取出並放置到結果變數中
20     while (n > 0) {
21       r = r * 10 + n % 10;
22       // 將給定的數除以10,繼續取下一個位數
23       n /= 10;
24     }
25     // 返回結果變數,即反轉後的數
26     return r;
27   }
28   
29   // 構建一個無符號整型數的列表
30   private static List<uint> Build(uint max) {
31     var res = new List<uint>();
32     // 從89開始迴圈到給定的最大值max
33     for (uint n = 89; n <= max; n++) {
34       ulong n2 = n * n, r2 = Reverse(n2);
35       // 計算當前數的平方,並將結果保存在變數n2中
36       // 將n2進行反轉,並將結果保存在變數r2中
37       if (r2 > 1 && r2 % 2 != 0) {
38         ulong r3 = Reverse(n2 * n);
39         // 如果r2為奇數且r3為奇數且r2和r3都是質數,則將當前數n添加到列表res中
40         if (r3 % 2 != 0 && IsOddPrime(r2) && IsOddPrime(r3)) res.Add(n);
41       }
42     }
43     // 返回列表res
44     return res;
45   }
46   
47   // 調用Build方法並傳入57200作為參數後的結果列表
48   private static List<uint> Seq = Build(57200);
49   
50   // 返回列表Seq中指定索引位置的數
51   public static uint SqCubRevPrime(int n) {
52     return Seq[n - 1];
53   }
54 }
  1. IsOddPrime 方法用於判斷一個無符號長整型數是否為奇數質數。它使用一個迴圈,從3開始,遞增2,直到迴圈變數的平方大於等於給定的數。在迴圈中,如果給定的數能夠被迴圈變數整除,則返回false,表示不是質數。如果迴圈結束後沒有找到能整除的數,則返回true,表示是質數。

  2. Reverse 方法用於將一個無符號長整型數進行反轉。它使用一個迴圈,將給定的數從個位開始依次取出並放置到結果變數中,然後將給定的數除以10,繼續取下一個位數,直到給定的數變為0。最後返回結果變數,即反轉後的數。

  3. Build 方法用於構建一個無符號整型數的列表。它首先創建一個空的列表變數 res,然後從89開始迴圈到給定的最大值 max。在迴圈中,首先計算當前數的平方,並將結果保存在變數 n2 中。然後將 n2 進行反轉,並將結果保存在變數 r2 中。如果 r2 大於1且為奇數,進一步計算 n2 的立方並將結果保存在變數 r3 中。如果 r3 為奇數且 r2 和 r3 都是質數,則將當前數 n 添加到列表 res 中。最後返回列表 res

  4. Seq 是一個列表變數,用於保存調用 Build 方法並傳入57200作為參數後的結果列表。

  5. SqCubRevPrime 是一個公共靜態方法,用於返回列表 Seq 中指定索引位置的數。它接受一個整型參數 n,並返回列表 Seq 中索引為 n - 1 的元素。


測試用例:

 1 namespace Solution {
 2   
 3   using NUnit.Framework;
 4   using System;
 5   
 6   [TestFixture]
 7   public class SolutionTest
 8   {
 9     static void Act(uint expected, int n) 
10       => Assert.AreEqual(expected, Edm.SqCubRevPrime(n), $"n = {n}");
11     
12     [TestCase(89, 1)]
13     [TestCase(271, 2)]
14     [TestCase(325, 3)]
15     [TestCase(328, 4)]
16     public void FixedTests(int expected, int n) => Act((uint)expected, n);
17     
18     [Test]
19     public void RandomTests([Random(1, 230, 50)] int n)
20     {
21       var solutions = new uint[] {89, 271, 325, 328, 890, 1025, 1055, 1081, 1129, 1169, 1241, 2657, 2710, 3112, 3121, 3149, 3244, 3250, 3263, 3280, 3335, 3346, 3403, 4193, 4222, 4231, 4289, 4291, 5531, 5584, 5653, 5678, 5716, 5791, 5795, 5836, 5837, 8882, 8900, 8926, 8942, 9664, 9794, 9875, 9962, 10178, 10250, 10393, 10429, 10499, 10550, 10577, 10651, 10679, 10717, 10718, 10739, 10756, 10762, 10810, 10844, 10895, 10898, 10943, 10996, 11035, 11039, 11084, 11137, 11159, 11164, 11182, 11191, 11290, 11351, 11371, 11575, 11690, 11695, 11707, 11722, 11732, 11795, 11827, 11861, 11885, 12109, 12124, 12242, 12268, 12304, 12361, 12362, 12410, 12433, 12436, 12535, 19144, 19267, 19271, 19273, 19385, 19433, 19442, 19451, 19501, 19564, 19597, 19603, 19631, 19637, 19766, 19846, 19865, 19871, 19909, 19927, 26464, 26491, 26570, 26579, 26621, 26704, 26944, 26965, 27001, 27029, 27052, 27100, 27101, 31120, 31210, 31223, 31237, 31261, 31327, 31331, 31351, 31463, 31469, 31490, 31534, 31561, 31657, 31726, 31739, 31784, 31807, 31883, 31928, 31978, 32066, 32072, 32213, 32255, 32308, 32431, 32440, 32446, 32500, 32539, 32564, 32573, 32630, 32656, 32708, 32749, 32759, 32800, 32888, 32969, 33059, 33254, 33325, 33338, 33350, 33404, 33460, 33475, 33509, 33568, 33575, 33701, 33833, 34030, 34112, 34159, 34163, 41351, 41429, 41473, 41501, 41608, 41639, 41839, 41879, 41930, 41933, 41992, 42029, 42089, 42103, 42121, 42179, 42220, 42235, 42310, 42326, 42385, 42463, 42466, 42524, 42575, 42607, 42682, 42782, 42839, 42890, 42910, 42982, 43045, 43049, 54986, 54991, 55073, 55310, 55492, 55589, 55598, 55603, 55651, 55697, 55718, 55778, 55840, 55859, 55879, 55916, 56005, 56093, 56261, 56279, 56356, 56530, 56681, 56780, 56809, 56968, 57160, 57185};
22       var expected = solutions[n - 1];
23       Act(expected, n);
24     }
25   }
26 }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 0. 數據說明 本項目所用數據集包含了一個家庭6個月的用電數據,收集於2007年1月至2007年6月。 這些數據包括有功功率、無功功率、電壓、電流強度、分項計量1(廚房)、分項計量2(洗衣房)和分項計量3(電熱水器和空調)等信息。該數據集共有260,640個測量值,可以為瞭解家庭用電情況提供重要的見 ...
  • 一、背景 微信小程式手機號授權介面,從23年8月開始實行付費驗證。 文檔地址:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getRealtimePhoneNumber.html 新版手機號授權說明如下 ...
  • 前提 已經創建並編寫好了windows服務程式,且下載了Microsoft Visual Studio Installer Project插件。 創建windows服務程式的參考鏈接:https://blog.csdn.net/xiketangAndy/article/details/1268518 ...
  • [QuickApi("hello/world")] public class MyApi : BaseQuickApi<Req,Rsp>{} 使用方式 : dotnet add package Biwen.QuickApi dotnet add package Biwen.QuickApi.Sour ...
  • 在項目中我們經常會使用到委托,委托是多播的,如果控制不好反覆註冊就會多次觸發,可以使用委托的單例模式去註冊,這樣可以避免多次觸發問題。 下麵是幾種委托實例代碼: 帶參數委托管理: /// <summary> /// 帶參數的委托管理 /// </summary> public class Actio ...
  • Word中的圖表功能將數據可視化地呈現在文檔中。這為展示數據和進行數據分析提供了一種方便且易於使用的工具,使作者能夠以直觀的方式傳達信息。要通過C#代碼來實現在Word中繪製圖表,可以藉助 Spire.Doc for .NET 控制項,具體操作參考下文。 C# 在Word中插入柱狀圖 C# 在Word ...
  • https://www.codenong.com/cs106719464/ WinForm中的UI假死其實是個老生常談的問題了,但最近還是很多人問我該如何解決,所以今天就來說明一下如何解決UI假死的問題。實驗程式界面如下圖所示: 方法一:async + await + Task 首先看下麵一段代碼: ...
  • C# BeginInvoke實現非同步編程-CSDN博客 https://blog.csdn.net/Nire_Yeyu/article/details/133203267 C# BeginInvoke實現非同步編程BeginInvoke實現非同步編程的三種模式: 1.等待模式在發起了非同步方法以及做了一些 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...