1. 程式人生 > >[ALGO-51] Torry的困惑(基本型)

[ALGO-51] Torry的困惑(基本型)

演算法訓練 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);
		}
	}
}