【问题标题】:How can I find out if a number is prime or not without using division or modulus in Java?在Java中不使用除法或模数如何确定一个数字是否为素数?
【发布时间】:2016-06-24 16:47:24
【问题描述】:

这是我当前的代码,但它使用除法(我不允许执行此任务)。如何在不使用 /% 运算符的情况下重写此代码?

public class PrimeNumber {
    public static void main(String[] args) {
        int num = 31;
        int c = 0;

        for (int i = 2; i < num; i++) {
            if ((num - (num / i) * i) == 0)
                c++;
        }
        if (c == 0)
            System.out.println("prime");
        else
            System.out.println("not prime");
    }
}

【问题讨论】:

  • 这是一个相当奇怪的约束。是家庭作业吗?还有其他要求吗?
  • 是的,这是一个需求问题..我也很惊讶如何编写它..
  • 您可以通过 Sieve of Eratosthenes 仅使用加法来找到素数。
  • @thatotherguy:你领先我一秒!

标签: java primes


【解决方案1】:

这是嵌套循环的一种方式(半伪代码):

int x ;
//check if x is a multiple of any two factors < x
for (int i1 = 2 ; i1 < x ; i1++) {
    for (int i2 = i1 ; i2 < x ; i2++) {
        prod = i1 * i2 ;
        if (prod > x) break ;
        if (prod == x) return "x is not prime" ;
    }
}
return "x is prime" ;

这应该是相当有效的,但对于大数字,您想要改进它。您可以进行一项检查:if (i1 == i2 &amp;&amp; prod &gt; x) return "x is prime" 这将消除大量迭代。

【讨论】:

  • 我刚刚注意到我的算法不会检测素数 2 和 3,只检测 > 4 的素数。所以你需要有一个特殊情况来捕捉 2 和 3。我猜你可以从 1 开始 i1 ,以及 i1 + 1 处的 i2,以捕获这些情况。使用 1 作为操作数来查找素数是一种 BS,但该算法不能将 x 本身视为操作数,所以它不会那样失败。
【解决方案2】:

从 2 开始循环,因为那是第一个素数:

        for (int i=2; i <=100; i++) {
            BigInteger bi = new BigInteger(""+i);
            if (bi.isProbablePrime(9999)) {
                System.out.println("Prime: " + i);
            }
        }

【讨论】:

    【解决方案3】:

    这是我刚刚为 c# 找到的代码,我认为它应该可以工作:

    using System;
    
    class Program
    {
        static void Main()
        {
        //
        // Write prime numbers between 0 and 100.
        //
        Console.WriteLine("--- Primes between 0 and 100 ---");
        for (int i = 0; i < 100; i++)
        {
            bool prime = PrimeTool.IsPrime(i);
            if (prime)
            {
            Console.Write("Prime: ");
            Console.WriteLine(i);
            }
        }
        //
        // Write prime numbers between 10000 and 10100
        //
        Console.WriteLine("--- Primes between 10000 and 10100 ---");
        for (int i = 10000; i < 10100; i++)
        {
            if (PrimeTool.IsPrime(i))
            {
            Console.Write("Prime: ");
            Console.WriteLine(i);
            }
        }
        }
    }
    

    【讨论】:

    • 如果这不起作用,那么您至少可以开发 0 到 100,000 之间的素数列表,然后检查该数字是否是该列表的一部分
    猜你喜欢
    • 2018-02-18
    • 2015-01-22
    • 1970-01-01
    • 2013-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-05
    • 2011-11-27
    相关资源
    最近更新 更多