【问题标题】:Loops and Prime Numbers循环和素数
【发布时间】:2013-09-12 17:41:48
【问题描述】:

编写一个程序,提示用户输入一个整数,然后打印出直到该整数的所有素数。例如,当用户输入 20 时,程序应该打印 2 3 5 7 11 13 17 19 回想一下,如果一个数不能被除 1 和它自己之外的任何数整除,那么它就是质数。

我正在尝试编写这个程序,但我遇到了困难,谁能告诉我如何编写这个代码? 这是我写的,但完全错误。

import java.util.Scanner;

public class PrimeNumbers
{
    public static void main(String[] args)
    {
        Scanner in = new Scanner(System.in);

        System.out.print("Enter Integers: ");
        int x;
        int n = in.nextInt();

        for (int i = 2; i < n ; i++)
        {
            x = i;

            if (n % i != 0 && i % x != 0)
            {
                System.out.println(i);
            }
            x--;
        }
    }
}

【问题讨论】:

  • 你试过什么?现在打印出来的是什么?你有写一些伪代码吗?您尝试实施的逻辑存在差距。如果您愿意,我们可以讨论。
  • “x”是干什么用的?
  • 也许尝试在调试器中单步执行程序,看看发生了什么?
  • @blgt 谷歌搜索预先编写的示例并不能帮助 OP 理解为什么他们的代码不起作用。
  • @Alex 都不会在没有做任何研究的情况下寻求帮助

标签: java loops while-loop


【解决方案1】:

使用以下方法计算小于或等于 N 的素数数 埃拉托色尼筛。

%java PrimeSieve 25

% java PrimeSieve 100

% java -Xmx100m PrimeSieve 100000000

%java PrimeSieve -Xmx1100m 1000000000 质数

110MB和1100MB是你要分配的内存量 到程序。如果您的计算机较少,请将此数字变小, 但它可能会阻止您解决非常大的问题 N的值。

class PrimeSieve {
    public static void main(String[] args) { 
        int N = Integer.parseInt(args[0]);

        // initially assume all integers are prime
        boolean[] isPrime = new boolean[N + 1];
        for (int i = 2; i <= N; i++) {
            isPrime[i] = true;
        }

        // mark non-primes <= N using Sieve of Eratosthenes
        for (int i = 2; i*i <= N; i++) {

            // if i is prime, then mark multiples of i as nonprime
            // suffices to consider mutiples i, i+1, ..., N/i
            if (isPrime[i]) {
                for (int j = i; i*j <= N; j++) {
                    isPrime[i*j] = false;
                }
            }
        }

        // count primes
        int primes = 0;
        for (int i = 2; i <= N; i++) {
            if (isPrime[i]){ primes++; System.out.print(i+", ");}
        }
        System.out.println("\nThe number of primes <= " + N + " is " + primes);
    }
}

【讨论】:

    【解决方案2】:

    使用此方法检查给定的 int 是否为素数。

    public static boolean isPrime(int a)
    {
        if ( a == 2)
            return true;
        int midpoint = Math.round(a/2);
        for(int i = 2; i < midpoint; i++)
        {
            if(a % i == 0)
                return false;
        }
        return true;
    }
    

    说明: 循环遍历所有数字,直到中点和模数,直到遇到 0 或没有。如果遇到 0 则返回 false 因为我们知道它不是素数,如果我们没有遇到零则返回 true 因为它是素数。
    我们循环到中点,因为不需要再循环了。

    你可以通过

    在你的循环中实现它
    for (int i = 2; i < n ; i++)
    {
        if (isPrime(i))
        {
            System.out.println(i);
        }
    }
    

    【讨论】:

    • 给别人一个固定的家庭作业答案没有什么意义。
    • 我加了解释,如果不是作业怎么办?我喜欢素数,没有功课就做这件事,但我之前确实像他一样在数学交流中寻求过帮助,并得到了答案。如果是家庭作业,那就让提问者感到羞耻,无论如何他都会不及格。
    猜你喜欢
    • 1970-01-01
    • 2014-09-19
    • 2018-08-08
    • 2015-01-08
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多