使用Java的素数检查器

时间:2016-07-23 11:15:49

标签: java

我只是Java的初学者。我已经尝试使用我已经知道的建立素数检查器。我使用了一种方法,找到给定数字的平方根,然后将数字除以小于该根的所有整数,如果在任何一种情况下,答案是" 0"那么这个数字不是素数;否则就是。

我的程序适用于整数数据类型最高编号为21147483647,但在每个数字的这个数字之后,它给出了相同的输出,如 - > "是!!这个数字是素数"。因此,我尝试使用双数据类型但结果仍然相同!对于2147483647之后的每个数字,它表示它是一个素数。

问题:在使用Math.floor()double存储更大的四舍五入的数字后,当我打印ArrayList时,它会显示元素" 0& #34;在其中,但最终结果条件if (contains(0) == true )被绕过,if ( contains (0) == false )被实现为大于2147483647的数字

使用Integer数据类型的第一个代码:

import java.util.ArrayList;
import java.util.Scanner;
public class UltimatePrime {
    public static void main (String[] args)
    {
        int mod;
        Scanner input = new Scanner(System.in);
        int number = (int) input.nextDouble(); //separate and get only integer part from the input 

        if (number >= 2 && number < 2147483647) //2147483647 is the limit for data type Integer
        {
            int j = (int) Math.sqrt(number); //get the integer square root of the input and assign it to j
            ArrayList modStorage = new ArrayList();
            for (; j>1; j--)
            {
                mod = number % j;  //divide the number with all numbers less than or equal to j
                modStorage.add(mod); //store all modulus or remainder operator results in ArrayList modStorage
            }
                if (modStorage.contains(0) == true) //if ArrayList modStorage contains 0 remainder than result = true
                {
                    System.out.println("Sorry" + ", " + number + " " + "is not a prime number.");
                }
                if (modStorage.contains(0) == false) //if ArrayList modStorage doesn't contain 0 remainder than result = false
                {
                    System.out.println("Yes!!" + " " + number + " " + "is a prime number.");
                }
            }

        else if ( number == 1) //special case for number 1
        {
            System.out.println("A prime number has only two factors: 1 and itself."
                    + "\nA composite number has more than two factors."
                    + "\nThe number 1 is neither prime nor composite.");
        }

        else //insuarace :D
        {
            System.out.println("Please enter proper number!");
        }

        input.close();
    }
}

使用double的第二代码:

import java.util.ArrayList;
import java.util.Scanner;
public class FinalPrime {
    public static void main (String[] args)
    {
        double mod;
        Scanner input = new Scanner(System.in);
        double number = input.nextDouble(); //separate and get only integer part from the input 
        number = Math.floor(number);
        if (number >= 2) 
            {
                double j = Math.sqrt(number); //get the integer square root of the input and assign it to j
                j = Math.floor(j);
                ArrayList modStorage = new ArrayList();
                for (; j>1; j--)
                {
                    mod = number % j;  //divide the number with all numbers less than or equal to j
                    modStorage.add(mod); //store all modulus or remainder operator results in ArrayList modStorage
                }
                if (modStorage.contains(0) == true) //if ArrayList modStorage contains 0 remainder than result = true
                {
                    System.out.printf("%.0f \n",number);
                    System.out.println("Sorry" + ", " + "it is not a prime number.");
                }
                if (modStorage.contains(0) == false) //if ArrayList modStorage doesn't contain 0 remainder than result = false
                {
                    System.out.printf("%.0f \n",number);
                    System.out.println("Yes!!" + ", " + "it is a prime number.");
                }
            }

        else if ( number == 1) //special case for number 1
            {
                System.out.println("A prime number has only two factors: 1 and itself."
                                + "\nA composite number has more than two factors."
                                + "\nThe number 1 is neither prime nor composite.");
            }

        else //insuarace :D
            {
                System.out.println("Please enter proper number!");
            }

        input.close();
    }
}

1 个答案:

答案 0 :(得分:0)

您的问题是int overflow2147483647int的最大值。此数据类型无法存储更大的数字。

Double应该用于浮动数字。

对于使用大整数,使用BigIntegerjava.math。只要您的计算机上有足够的内存,此类就可以存储无限大的数字。

修改

由于您有兴趣了解BigInteger如何运作,我决定编辑我的答案,并向您介绍BigInteger的世界。首先让我保证:你明白,double不是大整数的类型吗?如果它足够,您可以使用long,这是大于int的整数的类型。

如果long不够大,您应该尝试BigInteger。对于巨大的float,有BigDecimal类。让我们关注BigInteger s。

<强>的BigInteger

BigInteger类有public staticBigIntegerONETENZERO的三个BigInteger字段。如果您想检查BigInteger是否等于0(是的,BigInteger.ZERO也可以包含小整数),将它与BigInteger(0)进行比较肯定比创建新对象String更好

<强>建筑

施工人员怎么样?最常用的有三种。第一个采用String作为参数,第二个采用intBigIntegers基数(数字系统的基数),第三个采用位数组。

我用来构建public static的最后一种方法是名为valueOf()的{​​{1}}方法,它将longint作为参数。

BigInteger a = new BigInteger("1024"); // creates BigInteger representing number 1024.
BigInteger b = new BigInteger(1024); //also creates BigInteger representing number 1024.
BigInteger c = new BigInteger("10000000000", 2); //also creates BigInteger representing 1024

<强>运营

要检查BigInteger a是否等于BigInteger b,只需输入

即可
if (a.equals(b)) {...}

添加两个BigInteger s a,b类型

 BigInteger c = a.add(b);
 //or
 a = a.add(b);

随时阅读documentation,这很棒!无论如何,如果您有任何问题,请随时在评论部分询问。我会回应,直到周日晚上。