100只猴子从1 到3报数,报3的被淘汰,问最后剩下的一只是原来的第几只?
编程解决
用C语言,谢谢各位了

解决方案 »

  1.   

    建立一个数组a[100],全部初始化为1.
    两个变量,一个i表示当a的下标,一个j记录当前数的个数有没有到三,j=3就a[i]=0.
    while循环就行了.
      

  2.   

    这是一个约瑟夫环算法的经典问题.
    #include <stdio.h>
    #include <stdlib.h>int main(void)
    {
        int a[100]={0};
      int i, j, s;
      
       for (i = 0;i < 100;i++)
        {
            a[i] = i + 1;    /* 填空数组,编号是下标加一,注意C语言中的数组下标从0开始 */
        }  
        i=0;
        s=100;
        j=0;
        while(s > 1)
        {
       if(a[i%100] != 0)
       {
        if((i+1-j)%3 == 0)
        {  
         printf("%d\n",a[i%100]);    /* 把这个家伙打印出来 */
         a[i%100] = 0; 
         s--;
        }
       }
       else
        j++;   
       i++;
      }
      
      for(i=0; i<100; i++)
       if(a[i] != 0)
         printf("最后一个是:%d\n",a[i]);
      system("pause"); 
        return 0;                 
    }
      

  3.   

    呵呵,楼上的楼上完全错误,正确的是:(100%正确!)#include <stdio.h>
    #include <stdlib.h>int main()
    {
    int a[100]={0};
    int i,j,k,flg0,flg3=1;
    int out_5=0;
    for (i=0;i<100;i++)
    {
    a[i]=i+1;
    } flg0=100;
        printf("被提出的顺序为:");
     while (flg0>2) 
       {
     for (j=0;j<100;j++)
     {
     if(a[j]!=0)
     {
     if(flg3%3==0)
     {
         if(out_5%5==0)
          printf("\n");
        printf("%d     ",a[j]);
                                                      out_5++;
        a[j]=0;
     }
     flg3++;
    }
     }
     flg0=0; 
     for(i=0;i<100;i++)
     {       
     if (a[i]!=0)
     {
     flg0++;
     }  
     }  
     }
     printf("\n最后留下的是:\n");
     for(i=0;i<100;i++)
     {
     if(a[i]!=0)
     printf("%d    ",a[i]);
     } scanf("%d",&k); return 0;
    }
      

  4.   

    不对 ,我写错了一个数字,呵呵,改正如下:#include <stdio.h>
    #include <stdlib.h>int main()
    {
    int a[100]={0};
    int i,j,k,flg0,flg3=1;
    int out_5=0;
    for (i=0;i<100;i++)
    {
    a[i]=i+1;
    } flg0=100;
        printf("被提出的顺序为:");
     while (flg0>1) 
       {
     for (j=0;j<100;j++)
     {
     if(a[j]!=0)
     {
     if(flg3%3==0)
     {
         if(out_5%5==0)
          printf("\n");
        printf("%d     ",a[j]);
                                                      out_5++;
        a[j]=0;
     }
     flg3++;
    }
     }
     flg0=0; 
     for(i=0;i<100;i++)
     {       
     if (a[i]!=0)
     {
     flg0++;
     }  
     }  
     }
     printf("\n最后留下的是:\n");
     for(i=0;i<100;i++)
     {
     if(a[i]!=0)
     printf("%d    ",a[i]);
     } scanf("%d",&k); return 0;
    }