[ALGO-51] Torry的困惑(基本型)
阿新 • • 發佈:2019-01-01
演算法訓練 Torry的困惑(基本型)
時間限制:1.0s 記憶體限制:512.0MB
問題描述
Torry從小喜愛數學。一天,老師告訴他,像2、3、5、7……這樣的數叫做質數。Torry突然想到一個問題,前10、100、1000、10000……個質數的乘積是多少呢?他把這個問題告訴老師。老師愣住了,一時回答不出來。於是Torry求助於會程式設計的你,請你算出前n個質數的乘積。不過,考慮到你才接觸程式設計不久,Torry只要你算出這個數模上50000的值。
輸入格式
僅包含一個正整數n,其中n<=100000。
輸出格式
輸出一行,即前n個質數的乘積模50000的值。
樣例輸入
1
樣例輸出
2
分析:
1、解這道題的思路是先求出容量為 100000 個素數的素數表,然後直接根據輸入的 n 值求解
2、求解素數表可以使用“篩法”,“篩法”的具體方法可以參看我的另外一篇部落格http://blog.csdn.net/u011506951/article/details/26146595,但是第 100000 個素數是多少呢?我們事先不知道,此時可以靈活變通一下,先拋開本題,寫一個輔助演算法,求出第 100000 個素數的值,有了這個值,我們就可以很輕易的 PK 掉本題了
輔助類:目的是求解出第 100000 個素數的值
本題演算法原始碼:public class Help { public static void main(String[] args) { int num = 1; for (int i = 1; i <= 100000; i++) { num++; while (!isPrime(num)) { num++; } } System.out.println(num); } static boolean isPrime(int num) { for (int i = 2; i <= Math.sqrt(num); i++) { if (num % i == 0) { return false; } } return true; } }
import java.util.Scanner; public class Main { static int CONSTANT = 1299709; static int nums[] = new int[1299709 + 1]; static int[] primes = new int[100001]; static { createPrimes(); } private static void createPrimes() { for (int i = 2; i <= CONSTANT; i++) { if (nums[i] == 0) { for (int j = i * 2; j <= CONSTANT; j += i) { nums[j] = 1; } } } int k = 1; for (int i = 2; i <= CONSTANT; i++) { if (nums[i] == 0) { primes[k++] = i; } } } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { int n = scanner.nextInt(); int result = 1; for (int i = 1; i <= n; i++) { result = result * primes[i] % 50000; } System.out.println(result); } } }