| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付买域名,送MP3、MP4
高端软件开发 = 年薪十万不是梦赛孚耐:软件保护加密专家身份认证令牌USB KEY买空间,免费送域名(厦门中资源)
共有 713 人关注过本帖
标题:[求助]猴子选大王
收藏  订阅  推荐  打印 
iimiss
Rank: 1
等级:新手上路
帖子:29
积分:390
注册:2006-11-28
[求助]猴子选大王

这是一个猴子选大王的题目
猴子按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
积分:390
注册:2006-11-28

哎 靠谁都不如靠自己
我弄好了 谁有兴趣看哈嘿嘿
#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
积分:482
注册:2006-11-7

Joseph


2006-11-29 13:13
csight
Rank: 3Rank: 3
等级:中级会员
威望:1
帖子:293
积分:3040
注册:2006-6-11

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

#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-1 15:49
百年不亮
Rank: 4
等级:高级会员
威望:8
帖子:781
积分:8160
注册:2006-4-14

猴子选大王
#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才将计数器与对应元素联系起来.

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

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


闭门读书中,有事发邮件到liunanst@gmail.com
2006-12-1 18:33
iimiss
Rank: 1
等级:新手上路
帖子:29
积分:390
注册:2006-11-28

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

2006-12-1 18:37
zzymoon
Rank: 2
等级:注册会员
帖子:79
积分:890
注册:2006-9-19

用环形链表应该比较好做

程序天下,C的亡魂。 偶``````来自地狱
2006-12-1 19:08
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 0.049595 second(s), 9 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved