回 帖 发 新 帖 刷新版面

主题:这道题目答案很奇怪,麻烦高人解答。

写出下面这个程序的结果。
   void main()
   {
      int count,i;
      int x,y,z;
      x=y=z=0;
      scanf("%d",&count);
      for(i=0;i<count;i++)
      {
         x=(x+1)%2;
         y=(y+1)%3;
         z=(z+1)%5;
      }
      printf("x=%d,y=%d,z=%d\n",x,y,z);
   }
   如果运行时输入10, 结果是 x=          ,y=          ,z=          。
   如果运行时输入17, 结果是 x=          ,y=          ,z=          。
   答案:0   1   0
         1   2   2

为什么?

回复列表 (共2个回复)

沙发

这实际上是一个简单的同余问题。
程序的作用是:输入一个数,求它被2, 3, 5除得的余数是多少。这样理解的话,结果自然就好解释了。

推导过程。
代码x = (x + 1) % 2,循环count次。
设第i次循环开始时x的值为x(i),则:
x(i) = (x(i - 1) + 1) % 2    -->  记为(1)
并且我们已经知道x(0) = 0。

由(1)我们知道
x(i - 1) = (x(i - 2) + 1) % 2
代入(1)得到
x(i) = ((x(i - 2) + 1) % 2 + 1) % 2    --> 记为(2)

由数学知识,(a % c + b) % c = (a + b) % c
令a = x(i - 2) + 1, b = 1, c = 2,代入(2)得到
x(i) = (x(i - 2) + 1 + 1) % 2
     = (x(i - 2) + 2) % 2

按照上面的步骤反复代入,得到
x(i) = (x(i - 3) + 3) % 2
     = (x(i - 4) + 4) % 2
     = ...
     = (x(0) + i) % 2
因为已知x(0) = 0,所以x(i) = i % 2。也就是说,循环count次之后,x的值正好是count % 2。

同理,循环count次之后,y的值正好是count % 3,z的值正好是count % 5。

板凳

cout=0  1  2  3  4  5  6  7  8  9  10
x=   1  0  1  0  1  0  1  0  1  0  1  x=(x+1)%2就是1 0在变换

y=   1  2  0  1  2  0  1  2  0  1  2  y=(y+1)%3就是1 2 0在变换  

z=   1  2  3  4  0  1  2  3  4  0  1  z=(z+1)%5就是1 2 3 4 0在变换

我来回复

您尚未登录,请登录后再回复。点此登录或注册