从第一只猴子数1起,按1,2,3,这样数,数到3时,第三只猴子出列,取消其做猴王资格,这样由第四只猴子数1,再是第6只猴子出列,取消其做猴王资格 ,这样一直数,数到只剩最后一只猴子,
让它做王,用C编程,问哪只猴子是王,设猴子数为100,既问编号为多少的猴子做王?
知道的大哥大姐,请回我,谢谢了,如果有空顺便发到我邮箱里lw290801751@126.com谢谢了
我是新手。
以前就做过的:
#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]);
}

我的思路是用类似循环链表这样一种结构(开始时的元素个数为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)
qr9dBy5O.txt
			(507 Bytes)
			
			
		 8ulF794W.txt
			(507 Bytes)
8ulF794W.txt
			(507 Bytes)
			
			
		#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
    }
}
