查看关于循环的帮助

时间:2012-12-01 08:47:10

标签: c loops

由于是时候学习决赛,我必须提供一些关于循环的详细信息。我目前仍然坚持这个问题

int main(void) {
  int x = 0;
  int y = 0;
  while (y < 10) {
     x = 0;
     while (x != y) {// 
       x = x + 3; // how many times will we do this statement?
     }
     printf(“x is %d\n”, x);
     y = y + 1;
  }
}

基本上,我希望看到输出是什么以及我们提到的声明运行次数。换句话说,printf输出是什么样的。

我希望你能帮助我。

非常感谢你。

5 个答案:

答案 0 :(得分:1)

此行会导致问题

 x = 0;
 while (x != y) {// 
   x = x + 3; // how many times will we do this statement?
 }

y=1以后x将继续增加,直到达到最大整数值(除非发生一些溢出包装,否则它不能等于y - 这将导致无限循环)。

答案 1 :(得分:1)

首先,由于问题的性质以及没有官方(我知道)溢出包装的标准而不依赖于实现,答案正式* 不确定 *

那就是说,非正式地让一些数字只是为了它的地狱。我将为32位int计算这个,尽管64位的数字更令人印象深刻。 3作为增量的选择是非常有利的,(可能是设计?),因为2 ^ 32和2 ^ 64都不能被它整除,从而使其成为溢出连续性的理想选择。

一些可以简化操作的关键数字:

 2147483646 := (715827882 * 3)
-2147483647 := (2147483646 + 3) with overflow

Y = 0,X = 0,因此不执行迭代语句。

    在715827882增量之后,
  1. Y = 1,X = 0,3,6,9 ... 2147483646。下一个增量将溢出,X = -2147483647。另一个715827882增量,X = -1。再回到正区域再增加X = 2。重复整个过程,X = 1,总共4 * 715827882 + 3,总和= 2863311531
  2. Y = 2,X = 0,3,6,9 ....回想上面的(1),它花了2 *(715827882 + 1)个增量来达到2,也就是说,一次完整传球。因此另有1431655766次执行,sum = 4294967297
  3. Y = 3,由于显而易见的原因,在一次迭代中Y = X = 3。总和= <强> 4294967298
  4. Y = 4,重复(1),但再增加一个增量;因此4 * 715827882 + 3 + 1次迭代,或2863311533. sum = 7158278830
  5. Y = 5,重复(2),但再增加一个增量;因此2 *(715827882 + 1)+ 1次迭代,或1431655767,sum = 8589934597
  6. Y = 6,重复(3),但再增加一个增量;因此,1 + 1次迭代,sum = 8589934599
  7. Y = 7,重复(4),但再增加一个增量;因此4 * 715827882 + 3 + 1 + 1次迭代,或2863311533. sum = 11453246132
  8. Y = 8,重复(5),但再增加一个增量;因此2 *(715827882 + 1 + 1)+ 1次迭代,或1431655768,sum = 12884901900
  9. Y = 9,重复(6),但再增加一个增量;因此1 + 1 + 1次迭代,sum = 12884901903
  10. 假设您每秒可以旋转三亿次迭代,则需要大约 42.95秒才能完成。

    我将留下64位计算值得深思。然而,只是考虑实际数字,通过64位整数空间的(val + = 3)增量将需要 6148914691236517206 迭代,并且上面的一些步骤要求我们做两次,其他一次,而其他不在所有

    修改测试程序以确保我们使用32位signed int值:

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <stdint.h>
    #include <inttypes.h>
    
    int main(void)
    {
        int32_t x = 0;
        int32_t y = 0;
        uint64_t sum = 0;
    
        while (y < 10)
        {
            x = 0;
            while (x != y)
            {
                x = x + 3; ++sum;
            }
            printf("x is %d; sum=%" PRId64 "\n", x, sum);
            y = y + 1;
        }
        return 0;
    }
    

    <强>输出

    x is 0; sum=0
    x is 1; sum=2863311531
    x is 2; sum=4294967297
    x is 3; sum=4294967298
    x is 4; sum=7158278830
    x is 5; sum=8589934597
    x is 6; sum=8589934599
    x is 7; sum=11453246132
    x is 8; sum=12884901900
    x is 9; sum=12884901903
    

答案 2 :(得分:0)

这可能是一个技巧问题,也可能是一个经过深思熟虑的问题(或者可能是一个比最初看起来更高级的问题)。

答案是不确定的,因为它取决于整数溢出的属性。

我会告诉你为什么会这样。如果您最初没有看到它,请尝试使用笔和纸进行几次迭代。如果这会引发更多问题,请随时提出。 :)

答案 3 :(得分:0)

while (x != y) {可能会使while循环无限,永远不会破坏。

E.g。

  • 第一循环x = 0,y = 0
  • 第二次不执行。
  • 第二次迭代x = 0,y = 1
  • 在第二次循环中
    • 迭代1,x = 3
    • 迭代2,x = 6
    • 它继续,因为x永远不会是1。

答案 4 :(得分:0)

我认为你的内在,因为:

无限循环

x = 0且y = 1则x = x + 3(x = 3)始终为!= 1因此导致无限循环