主题:这道题目答案很奇怪,麻烦高人解答。
zlinsc
[专家分:0] 发布于 2010-07-06 23:55:00
写出下面这个程序的结果。
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个回复)
沙发
eastcowboy [专家分:25370] 发布于 2010-07-07 03:22:00
这实际上是一个简单的同余问题。
程序的作用是:输入一个数,求它被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。
板凳
alweeq86 [专家分:1170] 发布于 2010-07-07 08:36:00
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在变换
我来回复