嵌套for循环后的计数值 - Google Written

时间:2013-08-11 09:10:26

标签: c loops for-loop nested-loops

解决“嵌套for”循环的方法是什么?

前 -

for(i=0;i<10;i++)
for(j=i;j<10;j++)
for(k=j;k<10;k++)
for(l=k;l<10;l++)
for(m=l;m<10;m++)
   count++;

给出count = 2002 .. ?? (14C5)

我想到10 *(10 + 9)*(10 + 9 + 8)........ *(10 + 9 + 8 + 7 + 6)这是错误的。 另外,我想到了15C5。但这也是不正确的。

答案是...... 对于第一个循环,它是10/1
对于第二个循环,它是10 * 11 /(2 * 1)
对于第三个循环,它是10 * 11 * 12 /(3 * 2 * 1),依此类推..

请正确对我解释并提供正确的解决方法,因为面试官总是会修改这些问题。

2 个答案:

答案 0 :(得分:1)

以下是封闭形式为何的计数参数:

(10 + (number of loops - 1)) choose (number of loops)

考虑循环数为3的情况,因此我们有三个迭代器。现在可以在执行算法期间可视化迭代器的值。很难严格地说出来,但希望这会有所帮助:

0 | | | 1 2 3 4 5 6 7 8 9
0 | | 1 | 2 3 4 5 6 7 8 9
0 | | 1 2 | 3 4 5 6 7 8 9
...
0 | 1 | | 2 3 4 5 6 7 8 9
0 | 1 | 2 | 3 4 5 6 7 8 9
0 | 1 | 2 3 | 4 5 6 7 8 9
...
0 1 | | | 2 3 4 5 6 7 8 9
0 1 | | 2 | 3 4 5 6 7 8 9
...
0 1 2 3 4 5 6 7 8 9 | | |

它与12个插槽(最左边的插槽始终为0)完全相同,我们为迭代器选择三个插槽,然后用[1-9]顺序填充其余插槽。例如,一种可能的选择是{0, 5, 7},在这种情况下,您在每个插槽中放置一个迭代器,然后按顺序放置数字1-9:

Slots: 0 1 2 3 4 5 6 7 8 9 10 11
     0 | 1 2 3 4 | 5 6 | 7 8  9

不是我最好的计数论证,但我认为它可以解决这个问题。

现在你的实际问题是如何在现场提出这个问题。在短时间内找到封闭的表格似乎相当困难。也许他们只是想让你使用你在途中看到的任何小算术快捷方式手动找出count == 2002?快速进行手动计算的最明显方法是利用代码的递归特性。您可以迭代计算一个循环,两个循环,三个循环等count,并使用部分和来执行下一步。我的意思是:

1 Loop:
    10
    Sum: 10
2 Loop:
    10 9 8 7 6 5 4 3 2 1
    Partial Sums: 1
    => 1 + 2 = 3
    => 1 + 2 + 3 = 6
    => 1 + 2 + 3 + 4 = 10
    ...
    => Sum: 55 
3 Loop:
    10 9 8 7 6 5 4 3 2 1
    9 8 7 6 5 4 3 2 1
    8 7 6 5 4 3 2 1
    7 6 5 4 3 2 1
    6 5 4 3 2 1
    5 4 3 2 1
    4 3 2 1
    3 2 1
    2 1
    1
    Partial Sums: 1
    => 1 + 3 = 4
    => 1 + 3 + 6 = 10
    => 1 + 3 + 6 + 10 = 20
    ...

请注意,在三个循环的情况下,我们可以使用两个循环案例中的部分和来更快地计算总和(总是有十个部分和)。我可以想象在约15分钟内写出来,虽然它会非常痛苦。也许其他人会以聪明的洞察力来表达......

答案 1 :(得分:0)

当提出的编程逻辑超出了您可以正确追踪的程度时,请使用编译器。

以下是基于您的代码段的最低C程序,该代码段贯穿所有 for 循环,并在每次迭代期间打印所有变量的值。

/* testloop.c */

#include <stdio.h>

int main()
{
        static int count, i, j, k, l, m;

        for(i=0;i<10;i++)
            for(j=i;j<10;j++)
                for(k=j;k<10;k++)
                    for(l=k;l<10;l++)
                        for(m=l;m<10;m++) {
                            printf("i= %d\tj= %d\tk= %d\tl= %d\tm= %d\tcount= %d\n", i, j, k, l, m, count);
                            count++;
                        }   

        printf("After all loops count = %d\n", count);

}

按如下方式编译

$ gcc testloop.c -o testloop

并将其作为

运行
$ ./testloop

并观察输出以了解代码流。

0   0   0   0   0   count = 0
0   0   0   0   1   count = 1
0   0   0   0   2   count = 2
0   0   0   0   3   count = 3
0   0   0   0   4   count = 4
...
... (1985 more lines)
...
7   7   9   9   9   count = 1990
7   8   8   8   8   count = 1991
7   8   8   8   9   count = 1992
7   8   8   9   9   count = 1993
7   8   9   9   9   count = 1994
7   9   9   9   9   count = 1995
8   8   8   8   8   count = 1996
8   8   8   8   9   count = 1997
8   8   8   9   9   count = 1998
8   8   9   9   9   count = 1999
8   9   9   9   9   count = 2000
9   9   9   9   9   count = 2001
After all loops count = 2002