【问题标题】:Prime number method not working [closed]素数方法不起作用[关闭]
【发布时间】:2016-10-04 15:24:41
【问题描述】:

我正在尝试创建一个程序,允许用户输入选定数量的数字,作为回报,用户会得到两个列表。一个显示哪些数字是素数,另一个给出非素数。为什么这不起作用?当我希望它们在单独的数组中时,我最终将所有数字放在同一个数组中。在 isPrime 方法中将 isPrime 初始化为 true 时,所有数字都进入素数数组,而当我将其初始化为 false 时,则进入 notPrime 数组。

public static void main(String[] args) {
    System.out.println("How many numbers do you want to input?");
    Scanner in = new Scanner(System.in);
    int number = in.nextInt();
    int[] values = new int[number];
    for(int i = 0; i < values.length; i++) {
        System.out.println("Give value number " + (i+1) + ":");
        values[i] = in.nextInt();
    }
    int[] prime = new int[values.length];
    int[] notPrime = new int[values.length];
    for(int i = 0; i < values.length; i++) {    
        boolean erPrimtall = erPrimtall(values[i]);
        if(isPrime == true) {   
            prime[i] = values[i];
        } else {
            notPrime[i] = values[i];
        }
    }
    System.out.println("Prime numbers:");
    for(int i = 0; i < values.length; i++){
            System.out.println(prime[i]);
        }
        System.out.println("Other numbers:");
        for(int i = 0; i < values.length; i++){
            System.out.println(notPrime[i]);
        }
    }
    inn.close();
}

static boolean isPrimtall(int values) {
    boolean isPrime = true;
    for(int i = 2; i < Math.sqrt(values); i++) {
        if(values % i == 0) {
            isPrime= false;
            break;
        }
    }
    return isPrime;
}

【问题讨论】:

  • 请解释“不起作用”是什么意思,并告诉我们到目前为止您为排除故障所做的工作。另请访问help center 并阅读How to Ask 以了解如何有效地使用本网站。
  • 您的代码有错字:verdier 未定义。它应该是values

标签: java numbers primes


【解决方案1】:

您的 erPrimtall 函数的真/假值颠倒了。

static boolean erPrimtall(int values) {
    boolean isPrime = true;
    for(int i = 2; i < values; i++) {
        if(values % i == 0) {
            isPrime= false;
            break;
        }
    }
    return isPrime;
}

你可以进一步优化这个函数,只循环到i &lt;= Math.sqrt(values)

我还建议使用 ArrayList 而不是数组来存储素数和非素数,否则您将不得不做一些簿记以跟踪到目前为止有多少素数/非素数。

完整修改代码:

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

public class Main {

    public static void main(String[] args) {
        System.out.println("How many numbers do you want to input?");
        Scanner in = new Scanner(System.in);
        int number = in.nextInt();
        int[] values = new int[number];
        for(int i = 0; i < values.length; i++) {
            System.out.println("Give value number " + (i+1) + ":");
            values[i] = in.nextInt();
        }
        List<Integer> prime = new ArrayList<Integer>();
        List<Integer> notPrime = new ArrayList<Integer>();
        for(int i = 0; i < values.length; i++) {
            if(erPrimtall(values[i])) {
                prime.add(values[i]);
            } else {
                notPrime.add(values[i]);
            }
        }
        System.out.println("Prime numbers:");
        for(int n : prime){
            System.out.println(n);
        }
        System.out.println("Other numbers:");
        for(int n : notPrime) {
            System.out.println(n);
        }
        in.close();
    }

    static boolean erPrimtall(int values) {
        boolean isPrime = true;
        for(int i = 2; i <= Math.sqrt(values); i++) {
            if(values % i == 0) {
                isPrime = false;
                break;
            }
        }
        return isPrime;
    }
}

【讨论】:

  • 唯一的区别是我现在得到了素数数组中的所有值,而不是非素数数组。我无法将素数和非素数放在单独的数组中。
  • 我更新了我的答案。我不确定为什么它不会将素数和非素数分开,但它会在您的实现中将一堆意外的零添加到素数和非素数中。
  • 我必须专门使用数组,而不是 ArrayLists。但我想通了。无论如何,谢谢!
【解决方案2】:

我想通了。我不得不将布尔变量 isPrime 变成一个数组。现在所有整数值都对应于布尔数组中的一个布尔值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-26
    • 1970-01-01
    • 2016-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-22
    相关资源
    最近更新 更多