每日作业20200521 - 素数

题目

写一个程序, 输入 N ,输出从 0 开始的第 N 个素数
    样例输入: 9
    样例输出: 23

分析

质数:指在 大于 1 的自然数中,除了 1 和 它本身 以外不再有其他因数的自然数。

100以内的质数
	2	3	5	7	11	13	17	19	23	29
	31	37	41	43	47	53	59	61	67	71
	73	79	83	89	97	

思路:
	1.写一个判断 数n 是否为素数的方法
	2.写一个判断 1~第N个数 之间

代码

方法1

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Homework0521{
    public static void main(String[] args) {
        int input = judge();    //调用方法判断用户输入的是否合法
        method(input);  //调用方法
    }

    /**
     * 判断是不是素数
     * @param num   传入需要查询的数字
     * @return  是,返回true;否则返回false
     */
    public static boolean judge(int num) {
        for (int i = 2; i < num; i++ ){     //1不是素数
            if(num % i == 0 ){  //判断是否为素数
                return false;
            }
        }
        return true;
    }

    /**
     * 计算第 num 个素数的值
     * @param num 用户输入的值,查找第 num 个素数
     */
    public static void method(int num) {
        int count = 0;  //计数器
        int temp = count;   //临时变量
        System.out.println("这" + num + "个素数为:");
        for(int i = 2; ; i++){  //死循环
            if(judge(i)){   //调用judge方法,
                temp = ++count;     //是素数时,计数器+1,并赋值给临时变量
                System.out.print( i + (temp % 10 == 0 ? "\n" : "\t") );   //输出格式
            }
            if( temp == num ){   //计算到第num个时,输出
                System.out.println();
                System.out.println("第 " + num + " 个素数为:" + i);
                break;
            }
        }
    }

    /**
     * 用来判断用户输入的功能选项是否合法
     * @return 返回合法的结果
     */
    public static int judge() {
        Scanner sc = null;      //声明变量
        System.out.print("请输入要判断的编号:  ");
        int result = 0;     //定义变量
        int temp = 0;       //临时变量
        while(true){    	//循环判断
            sc = new Scanner(System.in);    //创建对象
            if(sc.hasNextInt() && (temp = sc.nextInt()) > 0 ){      //判断条件
                result = temp; 	//赋值
                break;  		//退出循环
            }else{
                System.out.print("请重新输入,要求为一个正整数:  ");
                continue;   //继续
            }
        }
        return result;  //返回
    }

}

方法1 - 运行结果

请输入要判断的编号:  3535个素数为:
2	3	5	7	11	13	17	19	23	29
31	37	41	43	47	53	59	61	67	71
73	79	83	89	97	101	103	107	109	113
127	131	137	139	14935 个素数为:149

方法2

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;

public class Homework0521 {
    public static void main(String[] args) {
        int input = judge();    //调用方法判断用户输入的是否合法
        result(input, input);
    }

    /**
     * 判断是不是素数
     * @param num   传入需要查询的数字
     * @return  是,返回true;否则返回false
     */
    public static boolean judge(int num) {
        for (int i = 2; i < num; i++ ){
            if(num % i == 0 ){
                //System.out.println(num + "不是素数");
                return false;
            }
        }
        return true;
    }

    /**
     * 计算 1~传入的数字 之间的素数
     * @param n 传入的数字
     * @return  返回结果
     */
    public static List count(int n) {
        List<Integer> result = new ArrayList();
        //int[] result = new int[n];
        int count = 0;
        boolean flag = false;
        for (int i = 2; i < n; i++){
            flag = judge(i);
            if(flag == true){
                //System.out.println(i + "是素数");
                //result[count++] = i;
                result.add(i);
                //count++;
            }
        }
        System.out.println("为减少计算次数,输出 1~" + n + " 之间的素数,如下:" );
        int k = 1;
        for (Integer i: result) {
                System.out.print(i + ( k % 10 == 0 ? "\n" : "\t"));
                k++;
        }
        System.out.println();
        return result;
    }

    /**
     * 计算结果
     * @param num 用户输入的数
     * @param n 扩大计算范围的参数
     * @return  返回计数器
     */
    public static int result(int num, int n) {
        int temp = n + 100;
        List<Integer> li = count(temp);     //对集合扩容,如计算第 35 个素数,则实际计算 1~135 以内的素数

        int count = li.size();      //集合的长度,存放素数的个数
        System.out.println("1~" + temp + " 之间共有 " + count + " 个素数");

        System.out.println("\n*******************************************************\n");

        if(count >= num){   //集合存放的素数个数 大于 所求的值时
            System.out.println("第" + num + "个素数是:" + li.get( num -1 ));
        }
        else {   //集合存放的个数不足时
            count = result( num, temp );    //对集合集合进行扩容计算,计算 1~235 之间的素数个数
        }
        return count;
    }

    /**
     * 用来判断用户输入的功能选项是否合法
     * @return 返回合法的结果
     */
    public static int judge() {
        Scanner sc = null;      //声明变量
        System.out.print("请输入要判断的编号:  ");
        int result = 0;     //定义变量
        int temp = 0;       //临时变量
        while(true){    //循环判断
            sc = new Scanner(System.in);    //创建对象
            if(sc.hasNextInt() && (temp = sc.nextInt()) > 0 ){      //判断条件
                result = temp;   //赋值
                break;  //退出循环
            }else{
                System.out.print("请重新输入,要求为一个正整数:  ");
                continue;   //继续
            }
        }
        return result;  //返回
    }

}

方法2 - 运行结果

请输入要判断的编号:  35
为减少计算次数,输出 1~135 之间的素数,如下:
2	3	5	7	11	13	17	19	23	29
31	37	41	43	47	53	59	61	67	71
73	79	83	89	97	101	103	107	109	113
127	131	
1~135 之间共有 32 个素数

*******************************************************

为减少计算次数,输出 1~235 之间的素数,如下:
2	3	5	7	11	13	17	19	23	29
31	37	41	43	47	53	59	61	67	71
73	79	83	89	97	101	103	107	109	113
127	131	137	139	149	151	157	163	167	173
179	181	191	193	197	199	211	223	227	229
233	
1~235 之间共有 51 个素数

*******************************************************35个素数是:149

总结

  1. 方法1 的耗时更短
  2. 方法2 提供另一种思路,但耗时更多,且方法2 严格来说不是很严谨
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值