该代码的基本思想是计算字符串化数字中有多少位,然后添加“填充”零。
现在让我们看看如何...
String result = Integer.toString(input);
数字的初始字符串化 ( 5 => "5"
)
for(i = 10, j = 1; i <= Math.pow(10, no_of_digits_required-1); i = i*10, j++)
i
将包含 10 的幂 (10, 100, 1000, 10000, 100000....) 我们知道我们可以停在10^(no_of_digits_required-1)
. 为什么?我们稍后会看到!j
是 the 的位数input
(它是一个计数器,我们知道它至少有一个数字,因为 even0
是由一个数字组成的)
if(input / i == 0)
不要看你所看到的......想想这个:这意味着:第一次i
大于input
。这是因为我们使用的是整数除法,所以任何数/任何较小的数 >= 1,而任何数/相同的数 == 1 并且任何数/更大的数 == 0。(第一次因为if
在break
,所以在第一次之后,for
循环将结束)
for(int k = 1; k <= no_of_digits_required-j; k++)
result = "0" + result;
在j
我们有我们的数字的位数,所以我们需要填充no_of_digits_required-j
的数量。0
他使用的是1 <= k <= no_of_digits_required-j
,所以基数为 1,而不是更经典的0 <= k < no_of_digits_required-j
(基数 0)
break;
我们还在里面if
。当我们第一次发现我们的数字中有多少位时,我们填充它,然后我们得到“正确”的结果,我们从“main”中打破for
。
现在唯一有趣的问题是为什么Math.pow(10, no_of_digits_required-1)
. 答案很简单:如果你要求no_of_digits_required == 1
,那么循环是无用的,因为你永远不需要填充。i = 10
, i <= 10^(1-1)
=> i <= 1
, 没有循环。no_of_digits_required == 2
我们有, i = 10
= i <= 10^(2-1)
> i <= 10
,所以只有一个循环。这没关系,因为只有当它 < 10(所以 0...9)时,我们才需要填充数字。if (input / i == 0)
实际上,它只会“激活”范围为 0...9... 的输入,依此类推。
我认为你的前同事已经准备好参加混淆 C 比赛了!