| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 793 人关注过本帖
标题:请问这题怎么做~
只看楼主 加入收藏
z9895512
Rank: 2
等 级:论坛游民
帖 子:24
专家分:43
注 册:2010-6-3
结帖率:100%
收藏
 问题点数:0 回复次数:8 
请问这题怎么做~
n个人围成一个圈,每个人对应一个编号,比如说,10个人,编号就是1——10。现在从第一个开始报数1,2,3这三个数。报到三的人就退出圈子,这样报到最后留下来的那个是员阿里编号为几的?(比如4个人,第一轮下来1——4报的数分别是1,2,3,1.报数为3的退出。此时,编号为1的要接上轮的编号为4的继续报数,应报数2.)

输出那个留下来的人的编号~
希望各位帮忙啊,越简洁越好~
搜索更多相关主题的帖子: 阿里 
2010-06-08 12:04
Spygg
Rank: 5Rank: 5
等 级:职业侠客
帖 子:135
专家分:394
注 册:2007-5-20
收藏
得分:0 
呵呵,经典源程序100例里面有,你自己找下
2010-06-08 12:10
kingmacrobo
Rank: 2
来 自:HUST
等 级:论坛游民
帖 子:39
专家分:49
注 册:2010-6-1
收藏
得分:0 
程序代码:
第一种方法:
#include<stdio.h>

#define M 10

#define N 3

void main(void)

{

   int a[M], b[M];      /*数组a存放圈中人的编号,数组b存放出圈人的编号*/

int i, j, k;

   for(i = 0; i < M; i++)               /*对圈中人按顺序编号1-M*/

      a[i] = i + 1;

   for(i = M, j = 0; i > 1; i--)

   {

/*i表示圈中人个数,初始为M个,剩1个人时结束循环;j表示当前报数人的位置*/

   for(k = 1; k <= N; k++)          /*1至N报数*/

   if(++j > i - 1) j = 0;/*最后一个人报数后第一个人接着报,形成一个圈*/

   b[M-i] = j?a[j-1]:a[i-1];    /*将报数为N的人的编号存入数组b*/

   if(j)

    for(k = --j; k < i; k++)/*压缩数组a,使报数为N的人出圈*/

     a[k]=a[k+1];

   }

   printf("按次序输出出圈人的编号为\n");

   for(i = 0;i < M - 1; i++)            /*按次序输出出圈人的编号*/

       printf("%6d", b[i]);

   printf("\n最后一人编号为%6d\n", a[0]);               /*输出圈中最后一个人的编号*/

}



[ 本帖最后由 kingmacrobo 于 2010-6-8 18:55 编辑 ]
2010-06-08 18:54
kingmacrobo
Rank: 2
来 自:HUST
等 级:论坛游民
帖 子:39
专家分:49
注 册:2010-6-1
收藏
得分:0 
第二中方法  用做标记的方法,而不用压缩数组:
程序代码:
#include<stdio.h>
#define M 10
#define N 3
void main(void)
{
int a[M], b[M];      
int i, j, k=0;
   for(i = 0; i < M; i++)              
      a[i] = i + 1;
   for(i=0, j = 0; k<=M-1; i++)
   {
       if (a[i]==0)
       {
       if (i==M-1)
           i=-1;
       continue;
       }
     
       if (++j==N)
       {
       b[k++] = a[i];
       j=0;
       a[i]=0;
       }
       if (i==M-1)
       i=-1;
   }
   printf("按次序输出出圈人的编号为\n");
   for(i = 0;i < M - 1; i++)          
       printf("%6d", b[i]);
   printf("\n最后一人编号为%6d\n", b[M-1]);              
}

2010-06-08 18:57
z9895512
Rank: 2
等 级:论坛游民
帖 子:24
专家分:43
注 册:2010-6-3
收藏
得分:0 
回复 4楼 kingmacrobo
谢谢啦!学到了!
2010-06-09 10:11
zhuxu0423
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:59
专家分:101
注 册:2010-4-12
收藏
得分:0 
#include "stdio.h"
#define N 8
int fun(int s[],int n,int m,int d)
{
   int i,x,j=d;
   if(m==1)
   {
    for(i=n-1;i>=0;i--)
    if(s[i]==1)
    {printf("当人数为%d时,最后一位的编号是:%5d",N,i+1);
    break;}
   }
   else
    {
     for(i=0;i<n;i++)
     {
       if(s[i]!=0)
       j++;
      if(j%3==0)
      s[i]=0;
     }
     x=m-(m+d)/3;
     d=(m+d)%3;
     fun(s,n,x,d);
    }
}
void main()
   {
    int ss[N];
    int a;
    for(a=0;a<N;a++)
    ss[a]=1;
    fun(ss,N,N,0);
   getche();
   }

2010-06-09 10:50
z9895512
Rank: 2
等 级:论坛游民
帖 子:24
专家分:43
注 册:2010-6-3
收藏
得分:0 
以下是引用kingmacrobo在2010-6-8 18:54:04的发言:

第一种方法:
#include
 
#define M 10
 
#define N 3
 
void main(void)
 
{
 
   int a[M], b[M];      /*数组a存放圈中人的编号,数组b存放出圈人的编号*/
 
int i, j, k;
 
   for(i = 0; i < M; i++)               /*对圈中人按顺序编号1-M*/
 
      a = i + 1;
 
   for(i = M, j = 0; i > 1; i--)
 
   {
 
/*i表示圈中人个数,初始为M个,剩1个人时结束循环;j表示当前报数人的位置*/
 
  for(k = 1; k <= N; k++)          /*1至N报数*/
 
   if(++j > i - 1) j = 0;/*最后一个人报数后第一个人接着报,形成一个圈*/


   b[M-i] = j?a[j-1]:a[i-1];    /*将报数为N的人的编号存入数组b*/
 
   if(j)
 
    for(k = --j; k < i; k++)/*压缩数组a,使报数为N的人出圈*/
 
     a[k]=a[k+1];
 
   }
 
   printf("按次序输出出圈人的编号为\n");
 
   for(i = 0;i < M - 1; i++)            /*按次序输出出圈人的编号*/
 
       printf("%6d", b);
 
   printf("\n最后一人编号为%6d\n", a[0]);               /*输出圈中最后一个人的编号*/
 
}
蓝色那两行没看懂~那个循环是输出K=N,J=0。但是对下面有什么作用我没弄清楚~ 进而 下面的我也理解不了了~
2010-06-09 11:01
遮天云
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:农村一小伙
等 级:贵宾
威 望:12
帖 子:1132
专家分:2671
注 册:2010-6-1
收藏
得分:0 
#include<stdio.h>
#define N 50
void main()
{
    int yiwei(int b[],int k);/*函数声明*/
    int i,count=0,a[N],n;
    a[0]=0;
    printf("请输入一个整数n:\n");
    scanf("%d",&n);
    for(i=1;i<=n;i++)/*从1开始一直排到n*/
        a[i]=i;
    for(i=1;i<=n;i++)
        printf("%2d",a[i]);
    printf("\n");
    yiwei(a,n);/*函数调用*/
    for(i=1;i<=n;i++)
    {
        if(a[i]!=0)
        {
            printf("剩下的是原来的第%d号\n",i);
        break;
        }
    }
}
int yiwei(int b[],int k)/*函数定义*/
{
    int i,j,count=0,t=1,h=1;
    for(j=1;j<=k;j++)
    {
   
    for(i=1;i<=k;i++)
    {
        if(b[i]!=0)
        {
          b[i]=h++;
           if(b[i]==3)
           {
            b[i]=0;/*报到三时归零*/
            count++;/*记录零元素的个数*/
            h=1;/*此时h归1*/
           }        
        }
         
           if(i==k)
            break;
            if(count==(k-1))/*当只有一个数不为零时跳出内循环*/
          {
            break;
          }
    }
    if(count==(k-1))/*当只有一个数不为零时跳出外循环*/
        break;
            
    }
    for(i=1;i<=k;i++)/*验证是否有n-1个0*/
        printf("%2d",b[i]);
    printf("\n");
   
    return(0);
}



    这是我做的
2010-06-09 19:57
z9895512
Rank: 2
等 级:论坛游民
帖 子:24
专家分:43
注 册:2010-6-3
收藏
得分:0 
#include <stdio.h>
#define N 7
#define M 3
 main()
{
    int a[N],i,j,t=-1,k=0,*q=a,b[N];

    for(i=0,j=1;;i++)
    {   if(k==N)break;
        if(j==M+1)j=1;
        if(i==N)i=0;
        if(q[i]!=M&&j==M)b[k]=i,k++;
        if(q[i]!=M)
        {
        t=i,q[i]=j;
        j++;
        }
    }
printf("出圈顺序为");
printf("\n");
    for(i=0;i<k-1;i++)
printf("%d  ",b[i]+1);
printf("\n");
printf("最后留下来的人编号为%d\n",t+1);
}


哎··还是自己的才看得懂,看别人写的真的很头大~~~  还是谢谢各位了
2010-06-14 20:44
快速回复:请问这题怎么做~
数据加载中...
 
   



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

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