| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1074 人关注过本帖
标题:[求助]n个人报数,报道3的推出.......
只看楼主 加入收藏
jinwenbobull
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2006-10-28
收藏
 问题点数:0 回复次数:10 
[求助]n个人报数,报道3的推出.......
有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
2007-01-06 10:15
渚薰
Rank: 6Rank: 6
等 级:贵宾
威 望:22
帖 子:1132
专家分:0
注 册:2006-8-6
收藏
得分:0 

最简单的是用循环数组,但是,有两个缺点
1、如果在人出列的时候,对数组进行删除操作,会加大时间复杂度
2、如果用结构体类型,表明某一个人已经出列,那么这样会加大空间复杂度

所以,这类题目(如果n很大的话),最好就是用链表,伪代码如下
typedef struct people{
    int num;
    people *next;
}

main() {
    根据n初始化单向循环列表,第一个节点为p;
    k=1;
    while (p->next!=p)    //判断是否只剩一个节点
    {
        if (k==3)
        {
            从链表中删除p节点,同时p指向被删除节点的后一个节点;
            k=1;
        } else {
            k++;
            p=p->next;
        }
    }
    最后打印p->num;
}

[此贴子已经被作者于2007-1-6 12:03:06编辑过]


个人ajax技术专题站: " target="_blank">http://www. 我不会闲你烦,只会闲你不够烦!
2007-01-06 12:01
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 

约瑟夫环一般解法的复杂度为o(n*m),如2楼所写遍是.
还有个o(n)的解法,利用简单的数学性质便可以证明.
代码如下:
其中,n为人数,m为报到第m个退出.
[CODE]int count(int n,int m)
{
int result=0,i;
for(i=2;i<=n;i++)
result=(result+m)%i;
return result+1;
}[/CODE]


对不礼貌的女生收钱......
2007-01-06 12:12
zbqf109
Rank: 1
等 级:新手上路
帖 子:289
专家分:0
注 册:2006-12-31
收藏
得分:0 
学习了!!

坚决不跟用TC的人打交道!
2007-01-06 12:15
C语言学习者
Rank: 4
等 级:贵宾
威 望:13
帖 子:1278
专家分:0
注 册:2006-9-26
收藏
得分:0 
数学方法,很难想出来的.

谁有强殖装甲第二部,可以Q我460054868
2007-01-06 12:24
渚薰
Rank: 6Rank: 6
等 级:贵宾
威 望:22
帖 子:1132
专家分:0
注 册:2006-8-6
收藏
得分:0 
不过遗憾的是,按3楼的编写无法得出中间过程,即依次出列的人员的编号

个人ajax技术专题站: " target="_blank">http://www. 我不会闲你烦,只会闲你不够烦!
2007-01-06 12:25
C语言学习者
Rank: 4
等 级:贵宾
威 望:13
帖 子:1278
专家分:0
注 册:2006-9-26
收藏
得分:0 

可以,只要加输出语句就可以.


谁有强殖装甲第二部,可以Q我460054868
2007-01-06 12:32
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 

恩,只求结果。这里,过程无法求出,因为没必要。
如果要,就按你的解法.不过当m>n时,要每次把m对n取模一下,再把n--.


对不礼貌的女生收钱......
2007-01-06 12:32
神秘失恋
Rank: 1
等 级:新手上路
帖 子:663
专家分:0
注 册:2007-1-6
收藏
得分:0 
以下是引用soft_wind在2007-1-6 12:12:03的发言:

约瑟夫环一般解法的复杂度为o(n*m),如2楼所写遍是.
还有个o(n)的解法,利用简单的数学性质便可以证明.
代码如下:
其中,n为人数,m为报到第m个退出.
[CODE]int count(int n,int m)
{
int result=0,i;
for(i=2;i<=n;i++)
result=(result+m)%i;
return result+1;
}[/CODE]



上帝之手.........
2007-01-06 16:35
wyzn12
Rank: 1
等 级:新手上路
帖 子:129
专家分:0
注 册:2006-10-28
收藏
得分:0 

自定义N和M,你可以运行看看

#define N 8
#define M 3
main()
{
int a[N],i,flag=0,num_flag=0;
for(i=0;i<N;i++)
a[i]=i+1;
printf("\noutput:\n");
i=0;
while(num_flag<N)
{
if(a[i]!=0)
{
flag++;
if(flag%M==0)
{
printf("=>%d",a[i]);
num_flag++;
a[i]=0;
}
}
i++;
if(i==N)i=0;
}
getch();
}


新王登基,血流成河!
2007-01-06 17:26
快速回复:[求助]n个人报数,报道3的推出.......
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012593 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved