问题描述
Torry从小喜爱数学。一天,老师告诉他,像2、3、5、7……这样的数叫做质数。Torry突然
想到一个问题,前10、100、1000、10000……个质数的乘积是多少呢?他把这个问题告诉老师。
老师愣住了,一时回答不出来。于是Torry求助于会编程的你,请你算出前n个质数的乘积。不过,
考虑到你才接触编程不久,Torry只要你算出这个数模上50000的值。
输入格式
仅包含一个正整数n,其中n<=100000。
输出格式
输出一行,即前n个质数的乘积模50000的值。
样例输入
1
样例输出
2
分析题意:很简单嘛,得到前n个质数和相乘再取和50000的模,这个模其实就是对50000取余,然而真的那么简单吗?还是有一些小坑的,目标条件 n<=100000,写过的人知道,这是有超时风险的。那么设计算法时就要注意下,提高时间效率的地方:对质数的判断->快和慢差别在这了,对质数的判断不要多余判断,假如对判断10000是否是质数,那么只需判断到它的开方根就行了,判断到100就行了,如果到100还没有因数,那之后也没了。
上代码
import java.util.Scanner;
/**
* @author zjg
* @date 2018/5/20 11:49
* @Description
*/
public class Main {
public static void main(String[] args) {
Scanner sca = new Scanner(System.in);
int x = sca.nextInt();
boolean boo;
long sum = 1;
int count = 0; //质数个数
long zhishu = 2; //质数开始的数
while (true) {
boo = true;
if (zhishu != 2 && zhishu % 2 == 0) { //先将2及2的倍数踢出
boo = false;
}
if (boo) {
for (int i = 3; i*i <= zhishu; i += 2) {//判断到平方根处就不判了
if (zhishu % i == 0) {
boo = false;
break;
}
}
}
if (boo) {
count++;
sum = sum * (zhishu%50000) % 50000;
if (count >= x) {
break;
}
}
zhishu++;
}
System.out.println(sum);
}
}
看下提交结果(通过):