首页 > 试题广场 >

下面两段代码中for循环分别执行了多少次?

[单选题]
下面两段代码中for循环分别执行了多少次?
1.
unsigned short i,j;
for(i=0, j=2; i!=j; i+=5, j+=7)
{}

2.
unsigned short i,j;
for(i=3,j=7;i!=j;i+=3,j+=7)
{}


  • 32767 16383
  • 32767 16363
  • 33787 16363
  • 33787 16383
推荐
答案:选A
答案分析:unsigned short能表示216个数,其范围为0~216-1,j在i前2个位置,i以5的速度增长,j以7的速度增长,当增长到unsigned short表示的最大值又会返回0(以一个圈的形式循环)开始重新走直到i、j相遇,所以就是7t - 5t + 2 = 216,所以为32767次
第二个类似 (7t + 7)-(5t - 3) = 216,所以为16383次
编辑于 2015-02-03 14:38:21 回复(16)
啥头像
跑圈追赶问题:
unsigned short 2个字节,2……16 = 65536
看成一个圈
1.
可认为j比i落后65536-2=65534距离,j比i每次多跑2距离
所以赶上需要65534/2=32767次

2.
j比i落后65536-4=65532距离,j比i每次多跑4距离
所以赶上需要65532/4=16383次
发表于 2016-03-03 13:07:44 回复(13)
选A
两段代码公式分别为:
(5*n1) mod 65536 = (7*n1+2) mod 65536
(3*n2 + 3) mod 65536 = (7*n2 + 7) mod 65536
得到结果为 32767 和16383
发表于 2015-08-16 11:32:39 回复(4)
正确答案为A
思路如下,转换成传统的数学公式。假设执行次数为n;
那么立方程可得:
0+5n=2+7n;
计算得出n=-1,显然是不合理的,也就是i的增量小于j的增量,是永远不可能相等的。但是i和j都是short类型,short类型确实有范围的。
也就是说当达到short类型的最大值时,会重新从0开始计算。也就是j领先了i整整一圈。改变方程式可得:
7n-5n+2 = 2^16;
解出n=32767,第二个同理
发表于 2017-08-31 17:30:14 回复(0)
对于无符号的整型,不存在溢出的问题,从0开始重新计算。对于有符号的整型,溢出之后,结果未定义。
发表于 2017-09-25 14:30:24 回复(0)
第一个 i通项公式为ai=5n i从0开始, j通项公式为b j =7n+2 j从0开始
ai-bi=k*len ,len =216=65536  => 2n+2=klen =>n = 32767 ...
上式可以理解为 ai≡bi mod len 即 a i -b i =k*len

第二个同理,可得 4n+4=k*len =>n =16383 ...
发表于 2016-07-27 09:25:57 回复(0)
相遇的时候,快者比慢者多跑了一圈,即2^16.
发表于 2015-10-28 10:28:18 回复(0)
unsigned short的取值范围为 0~216,也就是0~32768,假设第n次停止了,第n次i=5n,j=2+7n,i和j对32768求余后相等
发表于 2015-05-26 14:56:36 回复(0)
pcd头像 pcd
第一个for
(0+5k)%65536 == (2+7k)%65536
推导 (2k+2)%65536 == 0
推导 2k+2 == 65536
推导 k = 32767

第二个for
(3+3k)%/65536 == (4+4k)%65536
推导 (4+4k)%65536 == 0
推导 4k+4 == 65536
推导 k = 16383

发表于 2018-04-14 12:06:07 回复(0)
做出了追击问题的赶脚,一个把另一个超一圈时碰上,解一元一次方程。
发表于 2015-10-28 15:28:55 回复(0)
解题前置知识:short为短整型,2bytes大小,数值范围-2^15(-32768)~2^15-1(32767). unsigned short范围为0~2^16-1(65535). 
因i的增长速度小于j的增长速度,若不考虑数据类型的取值范围,本题则无法处理。正因变量i,j有范围限制(上溢时又回到0),故可将i,j视为环形跑道中的两名选手(初始时j领先i两步)。
此时可从两种视角来考虑选手的相遇问题: 
两名选手跑步步数相等时,则相遇(循环结束)。此时可列出数学公式:(7x+2) mod 2^16 = 5x mod 2^16,其中x为for循环的执行次数。
=> (2x+2)mod 2^16 = 0,即(2x+2)为65536的倍数,可写为(2x+2)= 65536*a。
显然我们希望跑的圈数a最少(for循环在i和j第一次相遇时就结束了)。
故a=1时,可解出x=32767。 
因j的增长大于i的增长,故j至少领先i一圈。此时可列出数学公式: 7x+2 = 5x+12+65536*a (a为圈数,x为循环执行的次数)。 
=> (x+1)=a*2^15。 同①处的分析,当a=1时,解出x=32767。
编辑于 2021-07-17 17:13:43 回复(0)
圆周追及相遇问题
7x+2-5x=65536,x=32767
发表于 2019-08-23 09:29:03 回复(0)
unsigned short表示2个字节,共16位,能表示的数的取值范围为0~65535
设运行n次之后i==j(i溢出k次,j溢出m次,由题知m>k),则有:
5*n % (65536k) = (7*n+2) % (65536m)
等价于:7*n+2 = 5*n + 65536z,
所以有,2(n+1) = 65536z,
解得,n=32768z-1,z最小取1,所以n最小为32767

同理:4(n+1)=65536z,  n = 16388z-1,所以n的最小值为16387




发表于 2019-03-07 16:17:26 回复(0)
这种追赶问题不用考虑short超过最大数65535字节溢出后的实际值,保证快的比慢的大一圈即可
发表于 2017-09-12 08:33:44 回复(0)
数学题啊
发表于 2016-01-18 15:29:41 回复(0)
j栈溢出之后从0开始重新计数,可知当i与j相同时,即j从0重新开始计数的值与i累积值相同,可得方程:5n=7(n-(65536-2)/7)
发表于 2023-06-10 10:05:48 回复(0)
1.中,每次差2,开始时差2
2.中,每次差4,开始时差4
所以1循环的次数是2循环次数的2倍
发表于 2018-06-14 15:55:24 回复(0)
前几年出的题都这么变态了
发表于 2018-03-29 10:54:25 回复(0)
7x-5x+2=65536 x=32767 7x-3x+7-3=65536 x=16383
发表于 2018-02-26 14:09:44 回复(0)
这个是数论的知识吗?
发表于 2017-10-09 13:45:12 回复(0)
第一个执行了32767次,第二个执行了16383次。注意定义的数据类型是short,i==j当且仅当j已经超过32768(unsigned short的模)后才可以满足。因此可以列式:(0+5x)+65536=2+7x,得x=32767。第二个答案同理可得。
发表于 2017-09-24 17:32:29 回复(0)