isPrime returns 相同值的不同结果?
isPrime returns different result for the same value?
这是一个确定 10 个数字数组中的元素是否为质数的程序。素数会被-1代替,打印时其他不变。
这对我来说似乎很好,但是当我 运行 我的代码带有 9 时,有些会得到 -1,这意味着 9 是素数(错误),有些 returns 9(因为不是素数).为什么我会遇到这个?有人可以帮忙吗
import java.util.Scanner;
public class Question5{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
int[] array = new int [10];
for (int i = 0; i < array.length; i++){
System.out.println("Enter your number " + i);
array[i] = input.nextInt();
}
System.out.println("Before method: ");
for (int i = 0; i < array.length; i++){
System.out.print(array[i] + " ");
}
System.out.println();
prime(array);
System.out.println("After the method: ");
for (int i = 0; i < array.length; i++){
System.out.print(array[i] + " ");
}
System.out.println();
}
public static void prime(int[] list){
boolean isPrime = true;
int count = 0;
for (int i = 0; i < list.length; i++){
isPrime = true;
for (int j = 2; j < i; j++){
count = i;
if (list[i] % j == 0){
isPrime = false;
break;
}
if (list [i] == 0 || list[i] == 1){
isPrime = false;
break;
}
if (list [i] == 2){
isPrime = true;
list[count] = -1;
}
}
if (isPrime){
list[count] = -1;
}
}
}
}
我立刻想到的主要逻辑问题是您没有正确检查素数。您应该从 2 循环迭代直到数组中的特定数字,检查除数。相反,您从 2 开始迭代直到列表的长度。试试这个版本:
public static void prime(int[] list) {
for (int i=0; i < list.length; ++i) {
int num = list[i];
boolean isPrime;
if (num == 1) {
isPrime = false;
}
else {
isPrime = true;
}
for (int j=2; j <= Math.sqrt(num); ++j) {
if (num % j == 0) {
isPrime = false;
break;
}
}
if (isPrime) {
list[i] = -1;
}
}
return;
}
public static void main(String args[]) {
int[] list = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
prime(list);
System.out.println(Arrays.toString(list));
}
以上main()
打印出来:
[1, -1, -1, 4, -1, 6, -1, 8, 9, 10]
你犯了三个错误:
- 您正在更新 list[count] 而不是 list[i]
- 内循环条件错误。应该是
j < list[i]
或者 j *j <= list[i]
- 您的代码将
0
和 1
识别为质数,这是不正确的。您应该在内部循环之前测试 if (list [i] == 0 || list[i] == 1)
。
代码应如下所示:
public static void prime(int[] list){
boolean isPrime = true;
int count = 0;
for (int i = 0; i < list.length; i++){
isPrime = true;
if (i < 2) {
isPrime = false;
} else {
for (int j = 2; j * j <= list[i]; j++){
count = i;
if (list[i] % j == 0){
isPrime = false;
break;
}
if (list [i] == 2){
isPrime = true;
list[i] = -1;
}
}
}
if (isPrime){
list[i] = -1;
}
}
}
例如:
Enter your number 0
0
Enter your number 1
1
Enter your number 2
2
Enter your number 3
3
Enter your number 4
4
Enter your number 5
5
Enter your number 6
6
Enter your number 7
7
Enter your number 8
8
Enter your number 9
9
Before method:
0 1 2 3 4 5 6 7 8 9
After the method:
0 1 -1 -1 4 -1 6 -1 8 9
这是一个确定 10 个数字数组中的元素是否为质数的程序。素数会被-1代替,打印时其他不变。
这对我来说似乎很好,但是当我 运行 我的代码带有 9 时,有些会得到 -1,这意味着 9 是素数(错误),有些 returns 9(因为不是素数).为什么我会遇到这个?有人可以帮忙吗
import java.util.Scanner;
public class Question5{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
int[] array = new int [10];
for (int i = 0; i < array.length; i++){
System.out.println("Enter your number " + i);
array[i] = input.nextInt();
}
System.out.println("Before method: ");
for (int i = 0; i < array.length; i++){
System.out.print(array[i] + " ");
}
System.out.println();
prime(array);
System.out.println("After the method: ");
for (int i = 0; i < array.length; i++){
System.out.print(array[i] + " ");
}
System.out.println();
}
public static void prime(int[] list){
boolean isPrime = true;
int count = 0;
for (int i = 0; i < list.length; i++){
isPrime = true;
for (int j = 2; j < i; j++){
count = i;
if (list[i] % j == 0){
isPrime = false;
break;
}
if (list [i] == 0 || list[i] == 1){
isPrime = false;
break;
}
if (list [i] == 2){
isPrime = true;
list[count] = -1;
}
}
if (isPrime){
list[count] = -1;
}
}
}
}
我立刻想到的主要逻辑问题是您没有正确检查素数。您应该从 2 循环迭代直到数组中的特定数字,检查除数。相反,您从 2 开始迭代直到列表的长度。试试这个版本:
public static void prime(int[] list) {
for (int i=0; i < list.length; ++i) {
int num = list[i];
boolean isPrime;
if (num == 1) {
isPrime = false;
}
else {
isPrime = true;
}
for (int j=2; j <= Math.sqrt(num); ++j) {
if (num % j == 0) {
isPrime = false;
break;
}
}
if (isPrime) {
list[i] = -1;
}
}
return;
}
public static void main(String args[]) {
int[] list = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
prime(list);
System.out.println(Arrays.toString(list));
}
以上main()
打印出来:
[1, -1, -1, 4, -1, 6, -1, 8, 9, 10]
你犯了三个错误:
- 您正在更新 list[count] 而不是 list[i]
- 内循环条件错误。应该是
j < list[i]
或者j *j <= list[i]
- 您的代码将
0
和1
识别为质数,这是不正确的。您应该在内部循环之前测试if (list [i] == 0 || list[i] == 1)
。
代码应如下所示:
public static void prime(int[] list){
boolean isPrime = true;
int count = 0;
for (int i = 0; i < list.length; i++){
isPrime = true;
if (i < 2) {
isPrime = false;
} else {
for (int j = 2; j * j <= list[i]; j++){
count = i;
if (list[i] % j == 0){
isPrime = false;
break;
}
if (list [i] == 2){
isPrime = true;
list[i] = -1;
}
}
}
if (isPrime){
list[i] = -1;
}
}
}
例如:
Enter your number 0
0
Enter your number 1
1
Enter your number 2
2
Enter your number 3
3
Enter your number 4
4
Enter your number 5
5
Enter your number 6
6
Enter your number 7
7
Enter your number 8
8
Enter your number 9
9
Before method:
0 1 2 3 4 5 6 7 8 9
After the method:
0 1 -1 -1 4 -1 6 -1 8 9