我試圖解決SPOJ上的這個問題,在這個問題中我必須找到在其數字總和爲素數的範圍內有多少數字。這個範圍可以很大,(給出10^8的上限)。天真的解決方案超時,我只是在整個範圍內循環,並檢查所需的條件。我似乎無法找到一種模式或公式。有人可以給一個方向繼續前進?查找其數字總和爲素數的數字
在此先感謝...
我試圖解決SPOJ上的這個問題,在這個問題中我必須找到在其數字總和爲素數的範圍內有多少數字。這個範圍可以很大,(給出10^8的上限)。天真的解決方案超時,我只是在整個範圍內循環,並檢查所需的條件。我似乎無法找到一種模式或公式。有人可以給一個方向繼續前進?查找其數字總和爲素數的數字
在此先感謝...
使用埃拉托色尼的篩子到最大總和(9 + 9 ......)生成素數。把它們放在哈希表中。然後你可能很快通過10^8的數字循環並加起來。可能有更有效的方法,但這應該足夠快。
這裏有一些提示:
希望這會有所幫助。
我(嚴重)懷疑這個「相反」的做法是否會比任何@ izomorphius的建議更快,但它可能會促使有關提高程序性能的一些想法:
1)獲取素數的列表範圍2..71(因爲它們都不是素數,所以可以忽略1和72)。
2)枚舉列表中每個素數的整數分區。這裏有一些Python code。你需要修改這個以免生成無效的分區,例如那些包含大於9的數字。
3)對於每個分區,用0填充一組8位數字,然後枚舉填充集合的所有排列。
現在你有你需要的數字列表。
我懷疑它會有很大的影響,因爲所需素數的範圍是'[1,72]' – amit 2012-03-27 12:49:15
@amit 10^7花了17秒,所以我猜10^8會花費10倍。這顯然不是最好的方式。但是,如果要求不低於1分鐘,那麼代碼很少,而且易於理解。 – 2012-03-27 13:02:28
我已經跑了10^8,花了3:11。 – 2012-03-27 13:07:55