免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: jronald
打印 上一主题 下一主题

据说是微软面试题 [复制链接]

论坛徽章:
0
41 [报告]
发表于 2006-12-08 10:51 |只看该作者
1024绝对正确

论坛徽章:
0
42 [报告]
发表于 2006-12-08 11:36 |只看该作者

2进制问题

2进制问题

论坛徽章:
0
43 [报告]
发表于 2006-12-08 14:37 |只看该作者
原帖由 crspo 于 2006-12-7 12:02 发表
(2000循环左移1)-1=1952

2000: 11111010000
2000循环左移1:11110100001
2000循环左移1-1:11110100000=1952



而且对其它的都有用,譬如说是200,
200:11001000
循环左移:10010001
减一:10010000=144

用程序算也是144

论坛徽章:
0
44 [报告]
发表于 2006-12-08 15:17 |只看该作者

哈哈,就是没有变体的约瑟夫问题

原帖由 jronald 于 2006-12-5 00:45 发表
圆圈上顺时针排列着1,2,3,....2000 这2000个数. 从1开始,顺时针隔一个拿走一个(1最先被拿走,下一个是3被拿走). 问最后剩下是哪一个数字.


      请大家再看看下面的一道全国计算机等级考试三级C语言上机考题:

    设有n个人围坐一圈并按顺时针方向从1到n编号,从第s个人开始进行1到m的报数, 报数到第m个人, 此人出圈, 再从他的下一个人重新开始1到m的报数,如此进行下去直到所有的人都出圈为止。现要求按出圈次序,给出这n个人的顺序表p。

    我相信很多朋友都熟悉这道经典的计算机上机考试题目吧。

    于是我对上面的所谓微软面试题改一下,如下:

    设有1999个人个人围坐一圈并按顺时针方向从2到2000编号,从第1个人开始进行1到2的报数, 报数到第2个人, 此人出圈, 再从他的下一个人重新开始1到2的报数,如此进行下去直到所有的人都出圈为止。现要求按出圈次序,给出这1999个人的顺序表;并求出最后出圈的人的编号是多少?

    最后出圈的人的编号就是楼主问题的答案。

[ 本帖最后由 xiaocongwjb123 于 2006-12-8 15:21 编辑 ]

论坛徽章:
0
45 [报告]
发表于 2006-12-08 15:38 |只看该作者
最后一个值是1952。
下面是我的推理:
(1:第一步是去掉所有奇数,即剩下2,4,6,8~~~~2000。
(2:将所有数除2,得到1,2,3~~~~1000。因上一步最后一个数未被取走,所以仍从“1”开始取。
(3:剩下2,4,6~~~1000。同理除以2得到1,2,3,4~~~500。上一步最后一个数(即最大的数)“1000”未被取走,所以仍从“1”开始取(这点很重要,若最后一个数被取走,则不能从最小的数开始取)。
(4:剩下2,4,6~~~500。同理除以2得到1,2,3,4~~~250。仍从“1”开始取。
(5:剩下2,4,6~~~250。同理除以2得到1,2,3,4~~~125。仍从“1”开始取。
(6:剩下2,4,6~~~124。同理除以2得到1,2,3,4~~~62。因为上一步最后一个数(即最大的 数)“125”被取走,所以这次要从2开始取(因为要隔一个取一次)。即这次顺序为:2,3, 4~~~62,1(注意这里最后一个为1)。
(7:剩下3,5,7~~~~61,1。所有数加1除2,得到2,3~~~~31,1。因为上一步最后一个数“1”未被取走,所以这次要从2开始取,即这次顺序为:2,3,4~~31,1。
(8:剩下3,5,7~~31。所有数减1除2,得到1,2,3~~~~15。因为上一步最后一个数“1”被取走,所以这次也要从2开始取,即这次顺序为:2,3,4~~15,1。
(9:剩下3,5,7~~15。所有数减1除2,得到1,2,3~~~~7。因为上一步最后一个数“1”被取走,所以这次也要从2开始取,即这次顺序为:2,3,4~~7,1。
(10:剩下3,5,7。因为上一步最后一个数“1”被取走,所以这次要从5开始取,剩下7。
(11:把7还原,即做以上各步的反运算:{[(7*2+1)*2+1]*2-1}*2*2*2*2*2=1952

写的不是很清楚,还请见谅!

论坛徽章:
0
46 [报告]
发表于 2006-12-08 16:03 |只看该作者
1952

[ 本帖最后由 trp111 于 2006-12-8 16:28 编辑 ]

论坛徽章:
0
47 [报告]
发表于 2006-12-08 16:37 |只看该作者
循环左移...
步长大于1的暂时没有close form的公式

论坛徽章:
0
48 [报告]
发表于 2006-12-08 18:06 |只看该作者
“回”字有四种写法!!!!

论坛徽章:
0
49 [报告]
发表于 2006-12-08 19:56 |只看该作者
原帖由 天行健!! 于 2006-12-8 15:38 发表
最后一个值是1952。
下面是我的推理:
(1:第一步是去掉所有奇数,即剩下2,4,6,8~~~~2000。
(2:将所有数除2,得到1,2,3~~~~1000。因上一步最后一个数未被取走,所以仍从“1”开始取。
(3:剩下2,4,6~~~1000。同理除以2得到1,2,3,4~~~500。上一步最后一个数(即最大的数)“1000”未被取走,所以仍从“1”开始取(这点很重要,若最后一个数被取走,则不能从最小的数开始取)。
(4:剩下2,4,6~~~500。同理除以2得到1,2,3,4~~~250。仍从“1”开始取。
(5:剩下2,4,6~~~250。同理除以2得到1,2,3,4~~~125。仍从“1”开始取。
(6:剩下2,4,6~~~124。同理除以2得到1,2,3,4~~~62。因为上一步最后一个数(即最大的 数)“125”被取走,所以这次要从2开始取(因为要隔一个取一次)。即这次顺序为:2,3, 4~~~62,1(注意这里最后一个为1)。
(7:剩下3,5,7~~~~61,1。所有数加1除2,得到2,3~~~~31,1。因为上一步最后一个数“1”未被取走,所以这次要从2开始取,即这次顺序为:2,3,4~~31,1。
(8:剩下3,5,7~~31。所有数减1除2,得到1,2,3~~~~15。因为上一步最后一个数“1”被取走,所以这次也要从2开始取,即这次顺序为:2,3,4~~15,1。
(9:剩下3,5,7~~15。所有数减1除2,得到1,2,3~~~~7。因为上一步最后一个数“1”被取走,所以这次也要从2开始取,即这次顺序为:2,3,4~~7,1。
(10:剩下3,5,7。因为上一步最后一个数“1”被取走,所以这次要从5开始取,剩下7。
(11:把7还原,即做以上各步的反运算:{[(7*2+1)*2+1]*2-1}*2*2*2*2*2=1952

写的不是很清楚,还请见谅!


我怎么觉得这就像转换二进制时候用的短除法呀,呵呵

论坛徽章:
0
50 [报告]
发表于 2006-12-09 13:20 |只看该作者
int arr[2000], cnt = 0;
char flag = 0;
memset(arr, 0, sizeof(arr));

for(int i = 0; ; i++)
{
        if(flag == 0 && arr[i%2000] == 0)
        {
                arr[i%2000] = 1;
                flag =  1;
                cnt++;
                if(cnt == 2000)
                {
                        //find it
                        printf("%d", i%2000);
                }
        }else if(flag == 1 && arr[i%2000] == 0){
                flag = 0;
        }
       
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP