【问题标题】:What's wrong with this code? Prime Numbers这段代码有什么问题?质数
【发布时间】:2012-05-20 17:41:38
【问题描述】:

我知道这不是找到素数的最佳方法,也不是最有效的方法;但是,我似乎找不到 169 算作质数的原因(就我而言,对于较小的数字,它可以正常工作)。

public static int checkPrime(int num, int i)
{
    if (i == num)
        return 1;

    else
    {
        if (num % i == 0)
            return 0;
        else
            checkPrime(num, i+1);

    }

    return 1;
}

主类:

        System.out.println("Type a number");
        number = reader.nextInt();

        if ((number % 10) % 2 == 0)
            result = 0;

        else
            result = checkPrime(number, 2);

        if (result == 1 || number == 2)
            System.out.println(number + " is a prime number");
        else
            System.out.println(number + " is NOT a prime number");

【问题讨论】:

  • 你为什么返回int,而不是bool
  • 您也忽略了递归调用的返回值。
  • 如果你检查的是某个数是素数,你为什么还要检查其他数?直接说if(number % divider == 0) ...
  • 您应该在调试器中运行它以发现它的行为与您的预期不同的地方。
  • 另外,我相信您也可以更改为if (i*i >= num) return 1,因为您不需要检查所有除数以确保它是素数,而只需从 2 到 num 的平方根。见Primality Test。这将在更少的递归周期内解决问题。

标签: java recursion numbers primes


【解决方案1】:

int 替换为boolean 以获得更好的表现力,并返回递归调用的值,您的方法如下所示:

public static boolean checkPrime(int num, int i)
{
    if (i == num)
        return true;    
    else
    {
        if (num % i == 0)
            return false;
        else
            return checkPrime(num, i+1);
    }
}

它仍然不适用于num < 2,它会一直运行到i 溢出。因此,作为主要的素数检查功能,您可以编写如下内容:

public static boolean checkPrime(int num)
{
   if(num<2)
     return false;
   else
     return checkPrime(num, 2);
}

顺便说一句,(number % 10) % 2 等同于 number % 2

【讨论】:

    猜你喜欢
    • 2015-04-25
    • 2018-09-09
    相关资源
    最近更新 更多