| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 840 人关注过本帖
标题:[求助]C语言的一个考题-->千里冰封转移
只看楼主 加入收藏
leliu
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2006-11-18
收藏
 问题点数:0 回复次数:4 
[求助]C语言的一个考题-->千里冰封转移
N只猴子,为了选猴王,它们排成一圈,并编号为1,2,3,4……N。
从第一只猴子数1起,按1,2,3,这样数,数到3时,第三只猴子出列,取消其做猴王资格,这样由第四只猴子数1,再是第6只猴子出列,取消其做猴王资格 ,这样一直数,数到只剩最后一只猴子,
让它做王,用C编程,问哪只猴子是王,设猴子数为100,既问编号为多少的猴子做王?
知道的大哥大姐,请回我,谢谢了,如果有空顺便发到我邮箱里lw290801751@126.com谢谢了
我是新手。
搜索更多相关主题的帖子: C语言 猴子 考题 千里冰封 
2006-11-18 19:23
fyi1106
Rank: 1
等 级:新手上路
帖 子:327
专家分:0
注 册:2006-10-14
收藏
得分:0 

以前就做过的:

#include "stdio.h"

main(){
unsigned short s[1000], i, j, r3, ri;
printf("\n\ninput the number:");
scanf("%u", &i); //用户输入,可输入100
for(j=1; j<=i;) s[j]=j++; //创建一个从1到i的数组
for(r3=0, ri=1, j=0; j<i; (++ri>i)?(ri=1):0) //j<i计挖掉数,(++ri>i)?(ri=1):0实现循环
if((s[ri]!=0)?(s[0]=s[ri]):0) //没挖掉就计一个数
if(++r3==3) s[ri]=r3=0, j++; //计数到3就挖掉,计数归0
printf("the rest is %u\n", s[0]);
}


JavaScript forever!
2006-11-18 23:38
ffj0711
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2006-11-4
收藏
得分:0 

我的思路是用类似循环链表这样一种结构(开始时的元素个数为N),每隔两个删掉后面的一个,直到元素的个数为一,最后得到的结果是91

#include <stdio.h>
#include <conio.h>
#define N 100

struct hh {
int flag; //代表初始时的次序,
struct hh* next;
};

int main()
{
struct hh *pt , a[N];
int i , sum;
for(i=0 ; i < N - 1 ; i++){
a[i].next = &a[i+1] ; //NEXT指向下一个元素;
a[i].flag = i + 1; //因为i是从0开始的,所以这里要加一
}
a[N-1].next = &a[0]; //形成一个完整的循环链表
a[N-1].flag = N;
sum = N; //剩下的元素个数;最初时当然时N个
pt = &a[0];
while( sum != 1){
pt = pt->next; //PT指针向后推移一个元素,即指向第二个元素
pt->next = (pt->next)->next; //此处删除第三个元素
pt = pt->next; //PT还要向下移一次,此时指向的是原来的第四个元素,此时一个循环结束,元素个数减一
sum--;
}
clrscr();
printf("the result is %d",pt->flag);
return 0;
}

[此贴子已经被作者于2006-11-19 17:12:52编辑过]



qr9dBy5O.txt (507 Bytes)


8ulF794W.txt (507 Bytes)
2006-11-19 09:36
ziyi555
Rank: 1
等 级:新手上路
帖 子:49
专家分:0
注 册:2006-11-4
收藏
得分:0 

#include<stdio.h>
void main()
{
int i,j=0,k=0,n,a[300]; //i 控制循环次数 j来表示喊123,k控制出圈的人数,n表示一共有多少人
printf("请输入多少个人:");
scanf("%d",&n);
for(i=0;i<n;i++) //将这么多人放在一个数组里 方便循环
a[i]=i+1;
for(i=0;k<n-1;) //循环到什么时候结束?退出的人一定要比总人数小1是不是?
{
if(a[i]!=0) //如果元素不为0就要报数
j++;
if(j==3) //报到3时
{
a[i]=0; //报到3时 就把这个元素的值变成0
k++; //报到3时 退出的人数就增加1个
j=0; //报到3时 就把报的数字变成0 下一个就会报1
}
i++; //循环下一个元素
if(i==n) //当最后一个人报完数 就要接到开头来继续报数
i=0; //所以又重新将 i 变成0 那么循环就会从开始再次进行,并且已经报过3的人的值已经变成0 计数器j就不会加

}
for(i=0;i<n;i++)
{ if(a[i]!=0)
printf("%d",a[i]); //因为报到3的人的值都已经变成0 只有最后一个人没有变0
}
}


放手一博
2006-11-19 13:53
leliu
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2006-11-18
收藏
得分:0 

谢谢各位大吓们,,
我对着回去试试

2006-11-19 18:45
快速回复:[求助]C语言的一个考题-->千里冰封转移
数据加载中...
 
   



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

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