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