题目描述:令Pi表示第i个素数。现任给两个正整数M <= N <= 10000,请输出PM到PN的所有素数。
输入描述:输入在一行中给出M和N,其间以空格分隔。
输出描述:输出从PM到PN的所有素数,每10个数字占1行,其间以空格分隔,但行末不得有多余空格。
输入例子:
5 27
输出例子:
11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103
解题思路:
1.看到涉及质数(素数)的题目,首先想到编写一个判断是否是质数的方法(isPrime)。
- 如果是质数返回true否则返回false。
- 循环从2开始,到该数的开根号。减小循环次数。在此区间一旦可以发生整除,则跳出循环返回false。
public static boolean isPrime(int num) {
for (int i = 2; i <=Math.sqrt(num); i++) {
if (num % i == 0) {
return false;
}
}
return true;
}
2.使用isPrime方法来判断一个数,如果是质数则count++,然后输出在要求范围内的质数。
3.本题有输出格式的限制,调整程序的输出。
- 用c来记录符合条件的质数的个数。不能被10整除的打空格,可以的换行。执行到最后一个满足条件的质数后结束程序。
完整代码如下:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int minPrime = sc.nextInt();
int maxPrime = sc.nextInt();
int count = 0, c = 0;
for (int i = 2; i <= Math.pow(2,31); i++) {
if (isPrime(i)) {
count++;
if (count >= minPrime && count <= maxPrime) {
System.out.print(i);
c++;
if (count == maxPrime) {
return;
}
if (c % 10 == 0) {
System.out.println();
} else {
System.out.print(" ");
}
}
}
}
}
public static boolean isPrime(int num) {
for (int i = 2; i <=Math.sqrt(num); i++) {
if (num % i == 0) {
return false;
}
}
return true;
}
}
题目来自:https://www.nowcoder.com/pat/6/problem/4079。上面有其他提交者优秀的解答。