首页 > 代码库 > [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);
		}
	}
}