该代码的基本思想是计算字符串化数字中有多少位,然后添加“填充”零。
现在让我们看看如何...
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 比赛了!