题目
写一个程序, 输入 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);
}
public static boolean judge(int num) {
for (int i = 2; i < num; i++ ){
if(num % i == 0 ){
return false;
}
}
return true;
}
public static void method(int num) {
int count = 0;
int temp = count;
System.out.println("这" + num + "个素数为:");
for(int i = 2; ; i++){
if(judge(i)){
temp = ++count;
System.out.print( i + (temp % 10 == 0 ? "\n" : "\t") );
}
if( temp == num ){
System.out.println();
System.out.println("第 " + num + " 个素数为:" + i);
break;
}
}
}
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 - 运行结果
请输入要判断的编号: 35
这35个素数为:
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
第 35 个素数为: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);
}
public static boolean judge(int num) {
for (int i = 2; i < num; i++ ){
if(num % i == 0 ){
return false;
}
}
return true;
}
public static List count(int n) {
List<Integer> result = new ArrayList();
int count = 0;
boolean flag = false;
for (int i = 2; i < n; i++){
flag = judge(i);
if(flag == true){
result.add(i);
}
}
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;
}
public static int result(int num, int n) {
int temp = n + 100;
List<Integer> li = count(temp);
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 );
}
return count;
}
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 的耗时更短
- 方法2 提供另一种思路,但耗时更多,且方法2 严格来说不是很严谨