使用Java的素数检查器

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


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


问题 :使用Math.floor()double来存储更大的舍入数字后,当我打印我的ArrayList它显示元素“0”,但最终结果条件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 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(); } } 

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

Double应该用于浮动数字。

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

编辑:

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

如果long不够大,你应该尝试BigInteger 。 对于巨大的floatBigDecimal类。 让我们关注BigInteger

的BigInteger

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

施工

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

我用来构造BigIntegers的最后一种方法是一个名为valueOf()public static方法,它将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)) {...} 

添加两个BigIntegera,b类型

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

随意阅读文档 ,这是伟大的! 无论如何,如果您有任何问题,请随时在评论部分询问。 我会回应,直到周日晚上。