首页
社区
课程
招聘
[讨论]一道搜狗的笔试题
发表于: 2013-5-8 09:40 4018

[讨论]一道搜狗的笔试题

2013-5-8 09:40
4018
unsigned short i,j;
for(i=0,j=2;i!=j;i+=5,j+=7)
{}
问循环了多少次

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (19)
雪    币: 183
活跃值: (1178)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
65535?
2013-5-8 09:56
0
雪    币: 565
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
追赶问题,设共需要x次才能追上,这i,j满足
5x+n*65536 = 7x + 2
n为整数
最小x解为32767,n为1
2013-5-8 10:04
0
雪    币: 6723
活跃值: (1199)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
强大
2013-5-8 10:06
0
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
65534。。。
2013-5-8 10:37
0
雪    币: 115
活跃值: (32)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
32767
字数补丁.exe
2013-5-8 12:15
0
雪    币: 859
活跃值: (309)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
7
32767.......
ps:3L算得真简便
2013-5-8 12:37
0
雪    币: 16
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
如果是两个人跑圈,按3楼的解法就可以了,但是计算机做循环加法,是离散的,循环32767次以后Sum_j 比Sum_i大1,所以还得继续循环32768次,所以答案是65534.
2013-5-8 15:29
0
雪    币: 123
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
应该这样算(5x-m*65536)=(7x+2-n*65536),若k=m-n,5x+k*65536=7x,同时5x-m*65536<65536,7x-n*65536<65536,7x-n*65536+2>0,5x-m*65536>0。n>7x/65536-65534/65536而x>65536*m/5代入,n>(5+2)x/65536-65534/65536中5x做替换就可以得到f(k)<f(x),这就是k必须满足的条件,其他同理扒拉扒拉,又因为开头有f(k)=g(x),可得g(x)<f(x),进一步压缩x和k范围
2013-5-8 15:58
0
雪    币: 565
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
汗,没考虑这么复杂过,我的思路就是8楼说的跑圈问题,每圈长度65536
关于离散的问题,我认为只要保证n和X同时是整数就是了。
例如:把j的初始值修改为1,则
5x+n*65536 = 7x + 1

则进入死循环。
2013-5-8 16:16
0
雪    币: 112
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
学习了,都是高手。
2013-5-9 16:20
0
雪    币: 14
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
加了两行代码,跑了一下

int main(int argc, char* argv[])
{
unsigned short i,j,k;
k = 0;
for(i=0,j=2;i!=j;i+=5,j+=7)
{k++;}
printf("Hello World! k=%d\n", k);
return 0;
}

结果如图

所以~~~三楼正解!
当然啦,面试的时候不能写代码跑一下,这只是后面的一个验证!如有不对之处,敬请指出
2013-5-9 16:56
0
雪    币: 275
活跃值: (51)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
13
很简单的追击问题,i的速度是5j的速度是7 两个人起跑点相差2,
跑到长度65536 也就是 j要比i多跑一圈少2,也就是65534,速度差是2
65534/2 = 32767
也可以认为是数论里面的 模问题
还有就是得注意边界问题
到底是32767 还是32766
for循环第一次进入循环不进行后面的+=操作,所以我们加32767次的时候两个数相等跳出循环,进入循环1+(322767-1)次
上传的附件:
2013-5-9 17:15
0
雪    币: 284
活跃值: (3554)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
14
考点是不是unsigned加满后会变为0?
2013-5-9 17:47
0
雪    币: 28
活跃值: (120)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
9L是直接找x和k的范围嘛 3L通过n来求x 感觉9L的(5x-m*65536)=(7x+2-n*65536),若k=m-n,5x+k*65536=7x,同时5x-m*65536<65536,7x-n*65536<65536,7x-n*65536+2>0,5x-m*65536>0和3L就是一个意思嘛,你这些约束条件3L就已经默认了;后面的约束就看不懂了
2013-5-9 17:50
0
雪    币: 403
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
数学不好  这个是什么数学式?该怎么解?n*65536怎么理解?
2013-5-9 18:04
0
雪    币: 275
活跃值: (51)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
17
unsigned char i,j,k,g;
        for(i=0,j=0,k=4 ;(i!=j)||(j!=k);i+=5,j+=7,k+=3)
这个版本有没有解?
2013-5-12 20:55
0
雪    币: 54
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
18
高人,学习。

ps:这帖子怎么会在web安全版块中?
2013-5-13 10:21
0
雪    币: 14
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
如果程序真的是这样的话,发布成release版之后这个空循环会被直接优化掉的,那岂不是就是0了?
2013-5-13 10:58
0
雪    币: 179
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
#include <stdio.h>
void main()
{
unsigned short i,j;
unsigned long  k=0;
for(i=0,j=2;i!=j;i+=5,j+=7)
{
        k=k++;
}
printf("循环次数是%d\n",k);
}
这样能看到循环次数吧
打出来是32767
2013-5-13 11:17
0
游客
登录 | 注册 方可回帖
返回
//