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

lanedm發表於2023-09-27

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

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

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

由於等電梯的人太多,小悅便開始回想那些神奇的數字,它們就像是被隱藏在數學世界中的寶藏,讓當時年少的她充滿了好奇與探索的慾望。她一一列舉出那些數字: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 }

 

相關文章