【问题标题】:Java mistaking primitive data types?Java误认为原始数据类型?
【发布时间】:2012-05-20 13:14:54
【问题描述】:

问题:我无法存储号码“600851475143”。我意识到这个数字大于 int 可以容纳的数字,并且小于最大 long 值。但是,我的程序没有将变量“number”注册为 long,而是将其注册为 int。有人可以阐明这个问题吗?

** - 问题所在

public class Problem3{
//What is the largest prime factor of the number 600851475143
public static void main(String[] args){
  ***long number = 600851475143 , total = 0;
    for(long x = (number-1)/2; x>1; x--)
      if(number%x == 0 && isPrime(x)) total += x;
    System.out.println(total);
}
private static boolean isPrime(long determine){
  for(long x = determine/2 - 1; x>1; x--)
    if(determine%x ==0) return false;
  return true;
}

}

解决方案:正如 Jim 在下面所说的,为了输入 long 类型,必须在数字末尾添加“L”或“l”。 "整数字面量如果以字母 L 或 l 结尾,则为 long 类型;否则为 int 类型。建议使用大写字母 L,因为小写字母 l 与数字 1 难以区分。” - 来自 Oracle 网站的原始类型。

更多信息: Java's L number (long) specification

【问题讨论】:

  • 我在您的代码中看到了 2147483647,而不是 600851475143。这不应该导致 number 成为 int 而不是 long...
  • 抱歉,我正在尝试解决我的问题。 “2147483647”是可以存储为 int 的最大数量。我意识到任何高于这个数字的数字都会导致错误。我编辑了我的原始帖子,以避免将来给人们带来潜在的困惑。

标签: java types primitive


【解决方案1】:

在这个字面值中放一个小“L”:

 600851475143L

原因是:

如果整数字面量以字母 L 或 l 结尾,则它是 long 类型;否则它是 int 类型。建议您使用大写字母 L,因为小写字母 l 很难与数字 1 区分开来。

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

你也可以使用这个符号,更清楚:

 600_851_475_143L

【讨论】:

  • 不一定是小“l”,也可以是大L。
  • 我建议不要使用小写 L,因为它通常看起来像 1(一)。而是使用大写 L。
  • 是的,有时很难区分 l 和 1。谢谢
【解决方案2】:

"我的程序没有将变量 "number" 注册为 long,它是 将其注册为 int"。

这是不正确的。您将其声明为长。很长。

你必须得到的是完全不同的东西:常量 600851475143 上的编译错误。试试 600851475143L。我建议,如果您更仔细地阅读编译器错误消息,您就会看到这一点。

【讨论】:

  • 谢谢,我做了进一步的研究。我的编译器只说“错误:整数太大:6008514751143”。
  • @user1390463 正如我所说。编译器已经准确地告诉你出了什么问题。您的第一个错误是将消息告诉您的内容破坏为“没有将变量“数字”注册为长”。
【解决方案3】:

长文字需要用尾随“L”表示,如600851475143L

【讨论】:

  • 谢谢吉姆。这帮助很大。
猜你喜欢
  • 2010-11-01
  • 2011-09-04
  • 1970-01-01
  • 2018-01-07
  • 1970-01-01
  • 1970-01-01
  • 2013-01-06
  • 1970-01-01
  • 2012-06-18
相关资源
最近更新 更多