幸運數字 - 它是m > 1 的最小整數,對於給定的正整數n,pn# m 是質數,其中pn# 是第一個n 的乘積質數。
例如,要計算第三個幸運數字,先計算前 3 個質數 (2, 3, 5) 的乘積,即 30。加 2 後得到 32,這是偶數,加 3 得到 33,是 3 的倍數。同樣可以排除 6 以內的整數。加上 7 得到 37,這是一個質數。因此,7是第三個幸運數字。
第一個原初數的幸運數字是 -
3, 5, 7, 13, 23, 17, 19, 23, 37, 61, 67, 61, 71, 47, 107, 59, 61, 109 ….
問題陳述
給定一個數字n。找出第 n 個幸運數字。
範例 1
Input: n = 3
Output: 7
解釋 - 前 3 個價格數字的乘積 -
2 3 5 = 30 30 + 7 = 37, a prime number.
範例 2
Input: n = 7
Output: 19
解釋 - 前 7 個質數的乘積 -
2 3 5 7 11 13 17 = 510510 510510 + 19 = 510529, a prime number.
方法一:原始方法
解決這個問題的一個簡單方法是先計算 pn#,也就是前 n 個質數的乘積,然後找到 pn# 與下一個質數之間的差。獲得的差額將是一個幸運的數字。
虛擬程式碼
procedure prime (num) if num <= 1 ans = TRUE end if for i = 2 to sqrt(num) if i is a factor of num ans = false end if ans = true end procedure procedure nthFortunate (n) prod = 1 count = 0 for i = 2 to count < n if i is prime prod = prod * i count = count + 1 end if nextPrime = prod + 2 while nextPrime is not prime nextPrime = next Prime + 1 ans = nextPrime - prod end procedure
範例:C 實作
在下面的程式中,透過計算前n個質數的本初以及找到本初後的下一個質數來計算幸運數。幸運數是下一個質數與本初數之間的差。
#include <bits/stdc++.h> using namespace std; // Function to find if a number is prime or not bool prime(unsigned long long int num){ if (num <= 1) return true; for (int i = 2; i <= sqrt(num); i++){ if (num % i == 0) return false; } return true; } // Function to find the nth Fortunate number unsigned long long int nthFortunate(int n){ long long int prod = 1, count = 0; // Calculating product/primorial of first n prime numbers for (int i = 2; count < n; i++){ if (prime(i)){ prod *= i; count++; } } // Find the next prime greater than the product of n prime numbers unsigned long long int nextPrime = prod + 2; while (!prime(nextPrime)){ nextPrime++; } // Fortunate number is the difference between prime and primorial unsigned long long int ans = nextPrime - prod; return ans; } int main(){ int n = 15; cout << n << "th Fortunate number : " << nthFortunate(n); return 0; }
輸出
15th Fortunate number : 107
時間複雜度- O(nsqrt(n)),其中prime() 函數的複雜度為O(sqrt(n)),nthFortunate() 中的for 迴圈的複雜度為O(nsqrt(n)) 。
空間複雜度 - O(1)
方法 2:埃拉托斯特尼篩法
埃拉托色尼篩用於將所有質數達到一個極限,我們將給出一個值 MAX。在這種方法中,我們建立一個包含所有 true 條目的布林數組,並將所有非素數索引標記為 false。然後將數組中的前 n 個質數相乘,得到前 n 個質數的乘積。然後與先前的方法類似,從 2 開始將乘積加 1,以獲得下一個質數。下一個質數與乘積之差就是所需的幸運數。
虛擬程式碼
procedure nthFortunate (n) MAX is set prime[MAX] = {true} prime[0] = false prime[1] = false for i = 1 to i*i <= MAX if prime[i] for j = i*i to MAX with j = j + i in each iteration prime [j] = false end if prod = 1 count = 0 for i = 2 to count < n if prime[i] prod = prod * i count = count + 1 end if nextPrime = prod + 2 while nextPrime is not prime nextPrime = nextPrime + 1 ans = nextPrime - prod end procedure
範例:C 實作
在下面的程式中,大小為 MAX 的布林素數數組記錄了 MAX 之前的所有質數。然後透過將前 n 個質數相乘來找到原初。然後與之前的方法類似,找到nextPrime。 nextPrime 和 Product 的差別在於幸運數字。
#include <bits/stdc++.h> using namespace std; // Function to find the nth Fortunate number unsigned long long int nthFortunate(int n){ // Setting upper limit for Sieve of Eratosthenes const unsigned long long int MAX = 1000000000; vector<bool> prime(MAX, true); prime[0] = prime[1] = false; // Sieve of Eratosthenes to find all primes up to MAX for (unsigned long long int i = 2; i * i <= MAX; i++){ if (prime[i]){ // Setting all the multiples of i to false for (int j = i * i; j <= MAX; j += i){ prime[j] = false; } } } // Find the first n primes and calculate their product unsigned long long int prod = 1, count = 0; for (unsigned long long int i = 2; count < n; i++){ if (prime[i]){ prod *= i; count++; } } // Find next prime greater than product unsigned long long int nextPrime = prod + 2; while (!prime[nextPrime]) nextPrime++; // Fortunate number is difference between prime and product return nextPrime - prod; } int main(){ int n = 25; cout << n << "th Fortunate number : " << nthFortunate(n); return 0; }
輸出
15th Fortunate number : 107
時間複雜度 - O(n log(log(n)))
空間複雜度 - O(MAX)
結論
綜上所述,第n個幸運數可以透過以下兩種方式找到。
初等方法:求前n個質數的乘積,並根據乘積計算下一個質數。質數與乘積之差是第 n 個幸運數。
埃拉托斯特尼篩法:找出所有達到某個極限的質數,然後計算與下一個質數的乘積,從而找到幸運數。
僅由於變數大小的限制,這兩種方法對於較小的 n 值都是有效的。對於更大的值,需要更有效率和最佳化的解決方案。
以上是找到第n個幸運數的詳細內容。更多資訊請關注PHP中文網其他相關文章!

C#適合需要高開發效率和跨平台支持的項目,而C 適用於需要高性能和底層控制的應用。 1)C#簡化開發,提供垃圾回收和豐富類庫,適合企業級應用。 2)C 允許直接內存操作,適用於遊戲開發和高性能計算。

C 持續使用的理由包括其高性能、廣泛應用和不斷演進的特性。 1)高效性能:通過直接操作內存和硬件,C 在系統編程和高性能計算中表現出色。 2)廣泛應用:在遊戲開發、嵌入式系統等領域大放異彩。 3)不斷演進:自1983年發布以來,C 持續增加新特性,保持其競爭力。

C 和XML的未來發展趨勢分別為:1)C 將通過C 20和C 23標準引入模塊、概念和協程等新特性,提升編程效率和安全性;2)XML將繼續在數據交換和配置文件中佔據重要地位,但會面臨JSON和YAML的挑戰,並朝著更簡潔和易解析的方向發展,如XMLSchema1.1和XPath3.1的改進。

現代C 設計模式利用C 11及以後的新特性實現,幫助構建更靈活、高效的軟件。 1)使用lambda表達式和std::function簡化觀察者模式。 2)通過移動語義和完美轉發優化性能。 3)智能指針確保類型安全和資源管理。

C 多線程和並發編程的核心概念包括線程的創建與管理、同步與互斥、條件變量、線程池、異步編程、常見錯誤與調試技巧以及性能優化與最佳實踐。 1)創建線程使用std::thread類,示例展示瞭如何創建並等待線程完成。 2)同步與互斥使用std::mutex和std::lock_guard保護共享資源,避免數據競爭。 3)條件變量通過std::condition_variable實現線程間的通信和同步。 4)線程池示例展示瞭如何使用ThreadPool類並行處理任務,提高效率。 5)異步編程使用std::as

C 的內存管理、指針和模板是核心特性。 1.內存管理通過new和delete手動分配和釋放內存,需注意堆和棧的區別。 2.指針允許直接操作內存地址,使用需謹慎,智能指針可簡化管理。 3.模板實現泛型編程,提高代碼重用性和靈活性,需理解類型推導和特化。

C 適合系統編程和硬件交互,因為它提供了接近硬件的控制能力和麵向對象編程的強大特性。 1)C 通過指針、內存管理和位操作等低級特性,實現高效的系統級操作。 2)硬件交互通過設備驅動程序實現,C 可以編寫這些驅動程序,處理與硬件設備的通信。

C 適合構建高性能遊戲和仿真係統,因為它提供接近硬件的控制和高效性能。 1)內存管理:手動控制減少碎片,提高性能。 2)編譯時優化:內聯函數和循環展開提昇運行速度。 3)低級操作:直接訪問硬件,優化圖形和物理計算。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

記事本++7.3.1
好用且免費的程式碼編輯器

Dreamweaver Mac版
視覺化網頁開發工具

SublimeText3 Linux新版
SublimeText3 Linux最新版