-6

由于是时候学习决赛了,我必须介绍一些有关循环的详细信息。我目前被困在这个问题上

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 输出是什么样的。

我希望你能帮我解决这个问题。

非常感谢。

4

5 回答 5

1

此行会导致问题

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

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

于 2012-12-01T08:54:43.400 回答
1

首先,由于问题的性质以及不依赖于实现的溢出包装的官方(据我所知)标准,答案是正式的 * indeterminable *

也就是说,非正式地让一些数字只是为了它的地狱。我将为 32bit 计算这个int,尽管 64bit 的数字更令人印象深刻。选择3as 增量是非常有利的,(也许是设计使然?)因为 2^32 和 2^64 都不能被它整除,因此非常适合溢出连续性。

一些使事情变得更容易的关键数字:

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

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

  1. Y=1, X=0,3,6,9...2147483646 在 715827882 增量后。下一个增量将溢出并且 X=-2147483647。稍后再增加一个 715827882,X=-1。再增加一个增量回到正区域和 X = 2。把整个事情重复一遍,X=1,总共 4*715827882 + 3,sum= 2863311531
  2. Y=2, X=0,3,6,9.... 回想一下上面的 (1),它需要 2*(715827882+1) 增量才能达到 2,也就是一次完整的通过。因此又执行了 1431655766 次,总和 = 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,总和 = 8589934597
  6. Y=6,重复(3),但增加一个增量;因此 1 + 1 次迭代,总和 = 8589934599
  7. Y=7,重复(4),但增加一个增量;因此 4*715827882 + 3 + 1 + 1 次迭代,或 2863311533。sum= 11453246132
  8. Y=8,重复(5),但增加一个增量;因此 2*(715827882 + 1 + 1) + 1 次迭代,或 1431655768,总和 = 12884901900
  9. Y=9,重复(6),但增加一个增量;因此 1 + 1 + 1 次迭代,总和 = 12884901903

假设您每秒可以旋转 3 亿次迭代,大约需要42.95 秒才能完成。

我将把 64 位计算留作深思。然而,只是为了考虑实际数字,通过 64 位整数空间的 (val+=3) 增量将需要6148914691236517206次迭代,并且上面的某些步骤需要我们执行两次,其他一次,而其他根本不需要。

修改测试程序以确保我们使用 32 位有符号整数值:

#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
于 2012-12-01T11:02:41.837 回答
0

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

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

我会让你弄清楚为什么会这样。如果您一开始没有看到它,请尝试使用笔和纸进行几次迭代。如果这引发了进一步的问题,请随时提问。:)

于 2012-12-01T08:51:21.590 回答
0

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

例如

  • 第一个循环 x = 0, y = 0
  • 第二个while不执行。
  • 第二次迭代 x = 0, y = 1
  • 在第二个while循环中
    • 迭代 1,x = 3
    • 迭代 2,x = 6
    • 它继续,因为 x 永远不会是 1。
于 2012-12-01T08:53:17.520 回答
0

我认为你内心的while,无限循环是因为:

x = 0 和 y = 1 然后 x = x + 3(x = 3) 总是 != 1 所以它会导致无限循环

于 2012-12-01T08:55:57.550 回答