java 蓝桥杯- 算法提高- Torry的困惑(提高型)

问题描述
  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);
    }

}


看下提交结果(通过):

猜你喜欢

转载自blog.csdn.net/zhangjingao/article/details/80383617