输入n,打印从1~n中的质数。(有两个方法)
输入:10
输出:2 3 5 7
2 3 5 7
解:
public class Main {
static boolean isPrime(int n) {// 判断是否为质数
if (n == 2)// 2是质数
return true;
if (n <= 1 || n % 2 == 0)// 小于等于1不是质数、2的倍数都不是质数
return false;
int sqrt = (int) Math.sqrt(n);
for (int i = 3; i <= sqrt; i += 2) {
if (n % i == 0)
return false;
}
return true;
}
static void find_Prime1(boolean[] a) {// 找质数法1
int len = a.length;
for (int i = 1; i < len; i++) {
a[i] = isPrime(i);
}
}
static void find_Prime2(boolean[] a, ArrayList<Integer> list) {// 找质数法2
int len = a.length;
for (int i = 2; i < len; i++) {
if (a[i] == true) {
list.add(i);
for (int j = i + i; j < len; j += i)// 质数的倍数均不是质数
a[j] = false;
}
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
boolean[] a = new boolean[n + 1];
find_Prime1(a);// 方法1
for (int i = 1; i <= n; i++)
if (a[i] == true)
System.out.print(i + " ");
System.out.println();
Arrays.fill(a, true);// 重置数组a,均设为true
ArrayList<Integer> list = new ArrayList<>();
find_Prime2(a, list);// 方法2
for (int i = 0; i < list.size(); i++)
System.out.print(list.get(i) + " ");
}
}
例题:数质数
令Pi表示第i个素数。现任给两个正整数M <= N <= 104,请输出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
解:
public class Main {
static void find_Prime(boolean[] a, ArrayList<Integer> list, int y) {
int num = 0;
int len = a.length;
for (int i = 2; i < len; i++) {
if (a[i] == false) {// false代表是质数
list.add(i);
num++;
if (num >= y)// 从1开始找end个质数
break;
for (int j = i + i; j < len; j += i)
a[j] = true;// true代表不是质数
}
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int x = in.nextInt();// 以第x个质数为开头
int y = in.nextInt();// 以第y个质数为结尾
boolean[] a = new boolean[999999];
ArrayList<Integer> list = new ArrayList<>();
find_Prime(a, list, y);
int count = 0;
for (int i = x - 1; i < y; i++) {// 从第x个开始,到第y个
System.out.print(list.get(i) + " ");
count++;
if (count % 10 != 0 && i < y - 1)// 换行时和第end个后面不用加空格
System.out.print(" ");
else
System.out.println();// 10个为1行
}
}
}