免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
1 [报告]
发表于 2006-12-05 13:14 |显示全部楼层
我的想法有点笨,不过也说说,大家集思广益嘛
最初的序列为:1,2, 3, 4, ..., 1999, 2000(总数为偶数)
第一次取掉所有奇数,即剩下(2, 4, 6, ..., 1998, 2000) = 2 * ( 1, 2, 3, ..., 999, 1000)(仍为偶数)
第二次取掉剩下数中所有奇数,即剩下2 * (2, 4, 6, ..., 998, 1000) = 2^2 *(1, 2, 3, ..., 499, 500)(偶数)
第三次取掉剩下数中所有奇数,即剩下2^2 * (2, 4, 6, ..., 498, 500) = 2^3 * (1, 2, 3, ..., 249, 250)(偶数)
第四次取掉剩下数中所有奇数,即剩下2^3 * (2, 4, 6, ..., 248, 250) = 2^4 * (1, 2, 3, ..., 124, 125)(注意!为奇数了
此时再取时,最后一个数2^4 * 125将被取掉,所以将第一个2放到最后,得:
第五次的结果:2^4 * (4, 6, 8, ..., 124, 2) = 2^5 * (2, 3, 4, ... , 62, 1)
为了简单,我们现在只对(2, 3, 4, ...., 62, 1) 取数,最后结果乘2^5即可。

先将(2, 3, 4, ..., 62, 1)序列映射为(1, 2, 3, ...., 61, 0)即原序列每个数减一,对新序列(1, 2, 3, ...., 61, 0)取数得:
第六次取数,得(2, 4, 6, ...., 60, 0) = 2 * (1, 2, 3, ..., 30, 0)(又是奇数了!)
(后面处理方法同上)
第七次取数,得 2 * (4, 6, 8, ..., 30, 2) = 2^2 * (2, 3, 4, ..., 15, 1)

再将(2, 3, 4, ..., 15, 1)映射为(1, 2, 3, ..., 14, 0)(原序列减一
第八次取数,得 ( 4, 6, ..., 14, 2)……进行下去此序列得到最终值14

所以最终结果为  ((14+1)* 2^2+1)*2^5 = 1952

不知道算错没有,做得好麻烦啊

[ 本帖最后由 tyc611 于 2006-12-5 13:30 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-12-05 13:29 |显示全部楼层
原帖由 jronald 于 2006-12-5 13:26 发表


1952正确


写那么长花了我好长时间的,不过按那方法算越来也蛮快的,收敛速度还行

论坛徽章:
0
3 [报告]
发表于 2006-12-06 17:56 |显示全部楼层
原帖由 qlks 于 2006-12-6 17:48 发表


如果fun(5)
为什么得到的是2?
不是第二次应该是4?


你算错了

论坛徽章:
0
4 [报告]
发表于 2006-12-07 12:19 |显示全部楼层
原帖由 crspo 于 2006-12-7 12:02 发表
(2000循环左移1)-1=1952

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


赞一个先!能说下为啥吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP