| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 11609 人关注过本帖
标题:[求助]猴子选大王
只看楼主 加入收藏
iimiss
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2006-11-28
收藏
 问题点数:0 回复次数:11 
[求助]猴子选大王

这是一个猴子选大王的题目
猴子按1,2..........n编号,坐一圈,从第一只按1,2.....m报数,报m的退出,一直循环,直到剩一只,输出大王的号
#include<stdio.h>

main()
{
int a[52],p,n=51,m=11,q;
for(p=1;p<=n;p++)
a[p]=p;
a[51]=0;
while(a[2]!=0)
{
while(m>n)
m=m-n;
for(q=m;q<=n;q++)
{
a[q]=a[q+1];}
n--;
}
printf("the king is:%d\n" ,a[1]);
}
大家帮忙看哈

搜索更多相关主题的帖子: 大王 猴子 
2006-11-28 22:16
iimiss
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2006-11-28
收藏
得分:0 

哎 靠谁都不如靠自己
我弄好了 谁有兴趣看哈嘿嘿
#include<stdio.h>
main()
{
int m,n,t,p,a[52];
printf("input the ammount of the monkeys(<=50) and the bigest integer:\n");
scanf("%d%d",&n,&m);
for(t=1;t<=n;t++)
a[t]=t;
a[n+1]=0;
while(a[2]!=0)
{
while(m>n)
m=m-n;
for(p=m;p<=n;p++)
{
a[p]=a[p+1];}
n--;
}
printf("the king is:%d\n" ,a[1]);
}

2006-11-29 13:09
磐涅
Rank: 1
等 级:新手上路
帖 子:38
专家分:0
注 册:2006-11-7
收藏
得分:0 

Joseph


2006-11-29 13:13
csight
Rank: 1
等 级:新手上路
威 望:1
帖 子:293
专家分:0
注 册:2006-6-11
收藏
得分:0 

头可断,发型不可乱;血可流,皮鞋不可不擦油;
2006-11-29 16:57
大妞
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2006-11-16
收藏
得分:0 

#include <stdio.h>
#include <stdlib.h>
#define NUM 6
#define COUNT 4

void main()
{
int a[NUM+1],i,n,c,t;
div_t divresult;

printf("NUM=%d COUNT=%d\n",NUM,COUNT);

for(i=1;i<=NUM;i++)
{
a[i]=1;
}

for(i=0,n=NUM;n>1;n--)
{
for(c=0;c<COUNT;)
{
i++;
if (i>NUM)
{
divresult=div(i,NUM);
i=divresult.rem;
}
c+=a[i];
}
a[i]=0;
}

for(i=1;a[i]<1;i++);
printf("the king is %d\n",i);
}

2006-12-01 15:49
百年不亮
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:789
专家分:0
注 册:2006-4-14
收藏
得分:0 

猴子选大王
#include<stdio.h>
#include<stdlib.h> //使用calloc()函数
void FindKing_pointer(int,int,int*);//移动指针法找大王
void FindKing_MoveArray(int,int,int*);//移动数组法找大王
void Initialize(int,int*);//初始化数组
int main()
{
int m,n,*ptr;
printf("输入猴子数与淘汰时报的数\n");
scanf("%d %d",&n,&m);
ptr=(int *)calloc(n,sizeof(int));
Initialize(n,ptr);
FindKing_pointer(m,n,ptr);
Initialize(n,ptr);
FindKing_MoveArray(m,n,ptr);
free(ptr);
return 0;
}

/*
在数组中依次填入1,2,3,4,…
*/
void Initialize(int n,int *ptr)
{
int i;
for(i=0;i<n;i++)
ptr[i]=i+1;
}

/*
循环一次指针向后移一位,所指元素不为0时计数器加1.
移动指针,当计数器数到m时将指针所指元素设为0.
*/
void FindKing_pointer(int m,int n,int *ptr)
{
int i,count,*ptr2;
count=n-1; //count=0时终止循环
ptr2=ptr; // 移动ptr2进行查找
for(i=0;count;ptr2++)
{
if(ptr2==ptr+n)
ptr2=ptr;
/*指针所指元素不为0时计数器加1.*/
if(*ptr2)
i++;
/*计数器数到m时将指针所指元素设为0*/
if(i==m)
{
*ptr2=i=0;
count--; //用于终止循环
}
}
/*最后不为0的元素的值即为大王的编号*/
for(ptr2=ptr;;ptr2++)
{
if(*ptr2)
{
printf("第%d个猴子是大王\n",*ptr2);
break;
}
}
}

/*
计数器i循环时自增,当i=m时用j标记当前数组元素下标
并该移动元素后的其它元素,同时i=0,数组长度n--,n=1时终止循环
最后数组首元素的值即为大王的编号
*/
void FindKing_MoveArray(int m,int n,int *ptr)
{
int i=0;
int j,k;
for(j=0;n-1;i++)
{
if(i+1==m)
{
j=(i+j)%n;
if(n-1-j)
for( k=j+1;k%n;k++) //移动j元素后的其它元素
ptr[k-1]=ptr[k];
n--;
i=-1;
}
}
printf("第%d个猴子是大王\n",*ptr);
}
----------------------------------------
运行结果(VC6.0环境下):
输入猴子数与淘汰时报的数
3 2
第3个猴子是大王
第3个猴子是大王
Press any key to continue
输入猴子数与淘汰时报的数
5 2
第3个猴子是大王
第3个猴子是大王
Press any key to continue
输入猴子数与淘汰时报的数
100 50
第95个猴子是大王
第95个猴子是大王
Press any key to continue
-------------------------------------------------------------------------------------------

总结:

选大王程序用了两种算法实现,第一种为最常规和最简单的算法,但是将指针从数组尾移动到数组头也很麻烦;第二种算法是偶尔想到的,开始感觉是最简单的,不用将指针从数组尾移动到数组头这样来回移,只需每次将数组长度缩小.但是编程实现时发现要将计数器与对应元素联系起来不简单,想了好久再引入变量j才将计数器与对应元素联系起来.

后来还想到一种算法,用链表,但是将指针从链表尾移动到链表头也很麻烦,于是又想到将链表首尾连起来.但这两种算法比以上两种更复杂,唯一的好处是熟悉链表的基本操作.

查书后发现只有第二种算法算是原创,其它几种书上都有.

2006-12-01 18:33
iimiss
Rank: 1
等 级:新手上路
帖 子:29
专家分:0
注 册:2006-11-28
收藏
得分:0 

嘿嘿楼上的 谢谢拉 才发现 原来这么多算法!~!以后多多指教

2006-12-01 18:37
zzymoon
Rank: 1
等 级:新手上路
帖 子:82
专家分:1
注 册:2006-9-19
收藏
得分:0 
用环形链表应该比较好做

程序天下,C的亡魂。 偶``````来自地狱
2006-12-01 19:08
秋天里的麦穗
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2012-10-29
收藏
得分:0 
回复 8楼 zzymoon
使用循环链表,最好完成
2012-11-05 23:21
dyh36_c
Rank: 1
等 级:新手上路
帖 子:2
专家分:5
注 册:2013-7-24
收藏
得分:0 
#include <stdio.h>

const int M = 3;

int main()
{
    int n, s = 0;
    scanf("%d", &n);
    int i;
    for (i = 2; i <= n; ++i)
        s = (s+M)%i;
    printf("%dn", s+1);
    return 0;
}
猴子选大王,在贴吧发现这样一个算法也行,有些不明白,求教!
2013-08-12 20:03
快速回复:[求助]猴子选大王
数据加载中...
 
   



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

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