免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
21 [报告]
发表于 2006-12-05 20:31 |只看该作者
1952

int fun(int n)
{
    int first=1, last=n, i;
    int *b = (int *)malloc(2*n*sizeof(int));

    for (i = 1; i <= n; ++i)
        b[i] = i;
   
    while(last-first != 1) {
        b[++last] = b[++first];
        ++first;
    }
    i = b[last];
    free(b);
    return i;
}

int main()
{
    printf("%d\n", fun(2000));
    getch();
    return 0;
}

[[i] 本帖最后由 xxandxx 于 2006-12-5 20:46 编辑 [/i]]

论坛徽章:
0
22 [报告]
发表于 2006-12-06 00:09 |只看该作者
原帖由 jronald 于 2006-12-5 00:45 发表
圆圈上顺时针排列着1,2,3,....2000 这2000个数. 从1开始,顺时针隔一个拿走一个(1最先被拿走,下一个是3被拿走). 问最后剩下是哪一个数字.


这个和约瑟夫问题有什么区别没?

论坛徽章:
0
23 [报告]
发表于 2006-12-06 00:14 |只看该作者
原帖由 zwylinux 于 2006-12-6 00:09 发表


这个和约瑟夫问题有什么区别没?


不知道约瑟夫问题啊

论坛徽章:
0
24 [报告]
发表于 2006-12-06 00:17 |只看该作者
就是约瑟夫环

论坛徽章:
0
25 [报告]
发表于 2006-12-06 00:19 |只看该作者
原帖由 灰色骆驼 于 2006-12-6 00:17 发表
就是约瑟夫环


知道那就没意思了

论坛徽章:
0
26 [报告]
发表于 2006-12-06 12:08 |只看该作者
找出规律:

1,3,5,...,2n-1,..,1999             1000/1000

2,6,10,..,2(2n-1),...,1998      500/500

4,12,.4(2n-1),1996,250/250

8,24,40,8(2n-1),125/125

16,48,80,16(2n-1),1984 63/62

32,96,160,32(2n-1),1952,(196 31/31

论坛徽章:
0
27 [报告]
发表于 2006-12-06 13:27 |只看该作者
大家正确,结果确实是1952,我前面的程序有bug
修正过的程序如下:

  1. <?php
  2. for ($array = array(), $i=0; $i<2000; array_push($array, ++$i));
  3. while (count($array)>1)
  4. {
  5.         unset($array[key($array)]);
  6.         if (!current($array))        /* 如果刚删除的是最后一个元素,从头开始的时候就要跳过一个 */
  7.         {
  8.                 reset($array);
  9.                 next($array);
  10.         }
  11.         elseif(next($array) === false) /* 如果删除的是倒数第二个元素,从头开始 */
  12.         {
  13.                 reset($array);
  14.         }
  15. }
  16. print_r($array);

  17. /* 结果是 1952 */
  18. ?>
复制代码

论坛徽章:
0
28 [报告]
发表于 2006-12-06 13:41 |只看该作者
用数组来做,可以指定步长:

  1. #include<stdio.h>
  2. #include<stdbool.h>

  3. int josephus(int * input, size_t count, unsigned int step)
  4. {
  5.         int i,n_step,result;
  6.         bool flag = true;

  7.         n_step = 0;
  8.         result = input[0];

  9.         while (flag)
  10.         {
  11.                 flag = false;

  12.                 for (i=0; i<count; i++)
  13.                 {
  14.                         if (input[i])
  15.                         {
  16.                                 if (0 == n_step%step)
  17.                                 {
  18.                                         n_step = 1;
  19.                                         input[i] = 0;
  20.                                 }
  21.                                 else
  22.                                 {
  23.                                         n_step++;
  24.                                         result = input[i];
  25.                                         flag = true;
  26. #ifdef _DEBUG
  27.                                         printf("mid:%d\n",result);
  28. #endif
  29.                                 }
  30.                         }
  31.                 }
  32.         }

  33.         return result;
  34. }

  35. void main(void)
  36. {
  37.         int test[2000];
  38.         int i,j;

  39.         for (i=0; i<2000; i++)
  40.         {
  41.                 test[i] = i+1;
  42.         }

  43.         j = josephus(test, 2000, 2);
  44.         printf("result:%d\n", j);
  45. }
复制代码

论坛徽章:
0
29 [报告]
发表于 2006-12-06 15:46 |只看该作者
原帖由 xxandxx 于 2006-12-5 20:31 发表
1952

int fun(int n)
{
    int first=1, last=n, i;
    int *b = (int *)malloc(2*n*sizeof(int));

    for (i = 1; i <= n; ++i)
        b = i;
   
    while(last-first != 1) {
     ...


这种算法我没想到过,呵呵,牛.........学习了

论坛徽章:
0
30 [报告]
发表于 2006-12-06 16:57 |只看该作者
原帖由 xxandxx 于 2006-12-5 20:31 发表
1952

int fun(int n)
{
    int first=1, last=n, i;
    int *b = (int *)malloc(2*n*sizeof(int));

    for (i = 1; i <= n; ++i)
        b = i;
   
    while(last-first != 1) {
     ...


有创意
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP