【问题标题】:Divisor value in for loop is mysteriously (?) changingfor 循环中的除数值神秘地(?)变化
【发布时间】:2019-03-14 02:06:38
【问题描述】:

所以我已经做了几个小时了,老实说,我完全被困住了。我写了一个 for 循环来计算整数中的数字数量,但我发现一旦我输入一个超过 10 位的数字,除数就会发生变化,我不知道为什么。我已经搜索了互联网无济于事,所以如果您有任何帮助或提示,我将不胜感激。谢谢!

 public static int getNumberOfDigits(long creditCardNumber)
{
    //problem with 0's at beginning and more than 10 digits
    int nDigitsInCard = 0;
    int divisor = (int) creditCardNumber;
    for(int i = 0; i <= creditCardNumber; i++){
        while(divisor!=0){
            divisor/=10;
            ++nDigitsInCard;
        }
}
    // return the number of digits in nDigitsInCard

    return nDigitsInCard;
}

【问题讨论】:

  • 将 int 更改为 long。您正在处理的数字太大,int 原语无法处理。发生的情况是它再次循环返回(范围从 - 10 到 10)然后放入 11 将循环返回到 -10。
  • divisor 的初始化中编写(int) 演员表之前,大概有一个编译器警告可能会丢失有效数字。添加演员表会抑制警告,但不能解决根本问题。

标签: java for-loop integer-division


【解决方案1】:

ints 不能容纳大于 2,147,483,647 的数字。您需要坚持使用longs 才能处理更大的数字。

【讨论】:

  • 很遗憾,将数据类型改成long后,我的代码还是有同样的问题。
  • @DarianRay 请使用新代码更新您的问题。
  • 没关系,我已经弄清楚了,我一直在使用错误的变量。不过,长数据类型是其中的一部分。感谢您的帮助!
【解决方案2】:

整数最多只能容纳 2 ^ 32 - 1 的数字。另外,为什么要将输入参数转换为整数?

另一件事是,您正在计算导致除数的每个数字中的位数,因为您在 for(int i = 0; i &lt;= creditCardNumber; i++){ ... } 中从 0 一直循环到 creditCardNumber。因此,例如 10000 将返回 1 中的位数,2 中的位数,一直到 10000。

最后,整个功能可以用一行来完成

return Long.toString(creditCardNumber).length();

return creditCardNumber.toString().length();

如果您将creditCardNumber 更改为Long 而不是long,但您必须在末尾加上l 后缀。

如果你想要更短的东西,你可以这样做

return (creditCardNumber+"").length();

【讨论】:

  • @ScaryWombat 不错,已修复
  • 嗨!感谢您的输入,我已经修复了所有这些错误。如果可以的话,我会使用 .length 快捷方式,但我的教授明确表示不要,所以我使用了 for 循环。
【解决方案3】:

当您的数字大于 10 位时,不会完成到整数的转换,因为整数不能包含大于 2^31 - 1 或 2,147,483,647 的值,这是一个只有 10 位的数字。我建议坚持使用long

【讨论】:

    猜你喜欢
    • 2014-10-23
    • 2022-01-18
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    • 2013-09-16
    • 1970-01-01
    相关资源
    最近更新 更多