hevv 发表于 2011-3-21 15:36:23

一个有点难度的题目

本帖最后由 旭日东升 于 2011-4-23 17:05 编辑

20个人围成一个圈!依次编号1~20!然后从1号开始循环报数:1,2,3,1,2,3。。。。

凡是报到3的立即退出!剩下的人这样继续一直持续下去!

请问:最后一个出队列的编号是多少?

答案:20号!

有兴趣的朋友不妨试试:晚上再附上代码!

f314191434 发表于 2011-3-21 22:08:10

这核心好像还是Josephus问题。。。
循环队列可以做出来

hevv 发表于 2011-3-22 01:51:10

本帖最后由 hevv 于 2011-3-22 14:28 编辑

这么经典的 题目
ai!居然没有人关注!看来大家喜欢吹水!

51641032 发表于 2011-3-22 13:52:11

循环队列......

51641032 发表于 2011-3-22 13:54:16

你的答案写得好乱,大括号也不打,数组下标也漏了,而且直接不能编译

hevv 发表于 2011-3-22 14:34:02

不是我的答案混乱!数组下标在这里编辑根本显示不出来!再说我的算出答案了,
至少在语法上没有错误了!

hevv 发表于 2011-3-22 14:42:57

回复 4# 51641032


    这都到了数据结构的知识了!

f314191434 发表于 2011-3-22 19:09:35

这么经典的 题目
ai!居然没有人关注!看来大家喜欢吹水!
hevv 发表于 2011-3-22 01:51 http://www.fishc.com/dz/images/common/back.gif


    我关注了。。。

john_zen 发表于 2011-3-26 11:00:54

回复 1# hevv
哇。。。传说中的约瑟夫问题。。。感觉数据结构的书在讲到链表的时候都会讲到阿

zhangtpku 发表于 2011-3-26 14:28:35

谭浩强书上的答案
#include <stdio.h>
void main()
{
        int i,k,m,n,num,*p;
        printf("input the number of person:n=");
        scanf("%d",&n);
        p=num;
        for(i=0;i<n;i++)
        {
                *(p+i)=i+1;
        }
        i=0;
        k=0;
        m=0;
        while(m<n-1)
        {
                if(*(p+i)!=0) k++;
                if(k==3)
                {
                        *(p+i)=0;
                        k=0;
                        m++;
                }
                i++;
                if(i==n)
                        i=0;
        }
        while(*p==0) p++;
        printf("the last one is N0.%d\n",*p);
}

hevv 发表于 2011-3-26 18:14:16

回复 10# zhangtpku


    这下两个 语言的版本都有了!

conbochen 发表于 2015-2-8 23:34:18

还没看明白

Draem 发表于 2020-4-2 16:56:09

#include<stdio.h>
#define max 100
int main(void)
{
        int i,j,k,a;
        int que = {0};
        printf("请输入队列人数: ");
        scanf("%d",&a);
        for(i = 0;i < a;i++)
        {
                que = i + 1;
               
        }
        i = j = k = 0;
        while(i < a - 1)
        {
                if(que[(j++)%a] != 0)
                {
                        k++;
                }
                if(k == 3)
                {
                        que[(j-1)%a] = 0;
                        k = 0;
                        i ++;
                }
        }
        i = 0;
        while(que == 0)
        {
                i++;
        }
        printf("最后剩下的号码是%d\n",que);
        return 0;
}

Draem 发表于 2020-4-2 16:59:31

#include<stdio.h>
#define max 100
int main(void)
{
        int i,j,k,a;
        int que = {0};
        printf("请输入队列人数: ");
        scanf("%d",&a);
        for(i = 0;i < a;i++)
        {
                que = i + 1;
               
        }
        i = j = k = 0;
        while(i < a - 1)
        {
                if(que != 0)
                {
                        k++;
                }
                if(k == 3)
                {
                        que = 0;
                        k = 0;
                        i ++;
                }
                j ++;
        }
        i = 0;
        while(que == 0)
        {
                i++;
        }
        printf("最后剩下的号码是%d\n",que);
        return 0;
}
页: [1]
查看完整版本: 一个有点难度的题目