當下午六點的鐘聲敲響,小悅如常地結束了一天的工作。她坐在工位上,腦海中不禁回想起自己學習數學的過程。那些數字、公式以及那些漫長夜晚的努力,都像是一段迷人的旋律,讓她無法忘懷。當她沉浸在回憶中時,那迷人的微笑映入了旁人的眼簾,而這一幕恰好被一位同事捕捉到。
“你在笑什麼呢?”同事好奇地問道。
“哦,沒什麼。”小悅笑著回答,“只是想起了一些有趣的數學問題。”
由於等電梯的人太多,小悅便開始回想那些神奇的數字,它們就像是被隱藏在數學世界中的寶藏,讓當時年少的她充滿了好奇與探索的慾望。她一一列舉出那些數字: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 }
-
IsOddPrime
方法用於判斷一個無符號長整型數是否為奇數質數。它使用一個迴圈,從3開始,遞增2,直到迴圈變數的平方大於等於給定的數。在迴圈中,如果給定的數能夠被迴圈變數整除,則返回false,表示不是質數。如果迴圈結束後沒有找到能整除的數,則返回true,表示是質數。 -
Reverse
方法用於將一個無符號長整型數進行反轉。它使用一個迴圈,將給定的數從個位開始依次取出並放置到結果變數中,然後將給定的數除以10,繼續取下一個位數,直到給定的數變為0。最後返回結果變數,即反轉後的數。 -
Build
方法用於構建一個無符號整型數的列表。它首先建立一個空的列表變數res
,然後從89開始迴圈到給定的最大值max
。在迴圈中,首先計算當前數的平方,並將結果儲存在變數n2
中。然後將n2
進行反轉,並將結果儲存在變數r2
中。如果r2
大於1且為奇數,進一步計算n2
的立方並將結果儲存在變數r3
中。如果r3
為奇數且r2
和r3
都是質數,則將當前數n
新增到列表res
中。最後返回列表res
。 -
Seq
是一個列表變數,用於儲存呼叫Build
方法並傳入57200作為引數後的結果列表。 -
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 }