0

我的同事正在尝试编写一种方法(在 Java/C# 中),该方法会将任意数量的零附加到String. 但是,我似乎无法弄清楚他的方法是什么。

这是Java代码,C#基本上是等价的:

String appendzeros(int input, int no_of_digits_required)
{
    String result = Integer.toString(input);
    int i,j;

    for(i = 10, j = 1; i <= Math.pow(10, no_of_digits_required-1); i = i*10, j++)
    {
        if(input / i == 0)
        {
            for(int k = 1; k <= no_of_digits_required-j; k++)
                result = "0" + result;

            break;
        }                    
    } 

    return result;
}

有任何想法吗?

4

3 回答 3

2

该代码的基本思想是计算字符串化数字中有多少位,然后添加“填充”零。

现在让我们看看如何...

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。(第一次因为ifbreak,所以在第一次之后,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 比赛了!

于 2013-08-29T14:13:12.980 回答
0

每当我遇到这些 WTF 代码时,我发现手动执行通常有助于弄清楚发生了什么。所以这里是 appendzeros(3, 3)

结果=“3”

我 = 10

j = 1

10 <= 100 所以运行循环体

如果 3 / 10 == 0(整数除法如此)

对于 k = 1;k <= 2

结果=“0”+结果

k =2; k <= 2

结果=“0”+结果

内部 for 循环完成回到外部 for 循环

我 = 100

j = 2

100 <= 100 所以运行循环体

if 3 / 100 == 0 true 运行内部 for 循环

k = 1

1 <= 1

结果=“0”+结果

并完成“0003”

i 和 j 都在不同的“数字空间”中跟踪相同的事物(结果是多少位数) i 通过十进制的宽度来跟踪它,而 j 通过计算 10 的幂来跟踪它。循环内的 if让您以 10 的正确幂开始添加零。

于 2013-08-29T14:10:17.503 回答
-1

如我所见,仅当输入为0时它才会插入“0”,并且它会按要求添加0。这本可以写得更好

于 2013-08-29T13:41:07.980 回答