for 循环中的除数值神秘地(?)变化
Posted
技术标签:
【中文标题】for 循环中的除数值神秘地(?)变化【英文标题】:Divisor value in for loop is mysteriously (?) changing 【发布时间】: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)
演员表之前,大概有一个编译器警告可能会丢失有效数字。添加演员表会抑制警告,但不能解决根本问题。
【参考方案1】:
int
s 不能容纳大于 2,147,483,647 的数字。您需要坚持使用long
s 才能处理更大的数字。
【讨论】:
很遗憾,将数据类型改成long后,我的代码还是有同样的问题。 @DarianRay 请使用新代码更新您的问题。 没关系,我已经弄清楚了,我一直在使用错误的变量。不过,长数据类型是其中的一部分。感谢您的帮助!【参考方案2】:整数最多只能容纳 2 ^ 32 - 1 的数字。另外,为什么要将输入参数转换为整数?
另一件事是,您正在计算导致除数的每个数字中的位数,因为您在 for(int i = 0; i <= 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
。
【讨论】:
以上是关于for 循环中的除数值神秘地(?)变化的主要内容,如果未能解决你的问题,请参考以下文章
Actionscript:for..in 循环的输出在 Flash IDE 和浏览器中的显示之间发生变化