使用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 overflow
。 2147483647
是int
的最大值。 此数据类型无法存储更大的数字。
Double应该用于浮动数字。
对于使用大整数,使用BigInteger
类,即java.math
类。 只要您的计算机上有足够的内存,此类就可以存储无限大的数字。
编辑:
由于您有兴趣了解BigInteger
工作原理,我决定编辑我的答案,并向您介绍BigInteger
的世界。 首先让我保证:你明白, double
不是大整数的类型吗? 如果它足够你可以使用long
,这是大于int
整数的类型。
如果long
不够大,你应该尝试BigInteger
。 对于巨大的float
有BigDecimal
类。 让我们关注BigInteger
。
的BigInteger
BigInteger
类有三个BigInteger
的public static
字段: ONE
, TEN
和ZERO
。 如果你想检查BigInteger
等于0(是的, BigInteger
也可以包含小整数),将它与BigInteger.ZERO
进行比较肯定比创建新对象BigInteger(0)
更好。
施工
那么施工人员呢? 最常用的有三种。 第一个采用String
作为参数,第二个采用String
和int
基数(数字系统的基数),第三个采用位数组。
我用来构造BigIntegers
的最后一种方法是一个名为valueOf()
的public static
方法,它将long
或int
作为参数。
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
的a,b
类型
BigInteger c = a.add(b); //or a = a.add(b);
随意阅读文档 ,这是伟大的! 无论如何,如果您有任何问题,请随时在评论部分询问。 我会回应,直到周日晚上。