• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
The Heart In Binding
博客园    首页    新随笔    联系   管理     

Joseph函数

题目:设有n个人围坐一圈,并按顺时针方向从1到n编号,从第s个人开始进行1到m的报数,报数到第m个人,此人出圈,再从他的下一个人重新开始1到m的报数,如此进行下去直到所有的人都出圈为止。现要求按出圈次序,每10个人一组,给出这n个人的顺序表,请编制函数Joseph()实现此功能。

 

#include<stdio.h>

#include<stdlib.h>

 

int Joseph(int n,int s,int m);

int main(void)

{

   int n=0,s=0,m=0;//n为总人数,s为开始报数人的编号,m为报数多少个人后结束

  

  

   printf("请输入总人数:");

   scanf("%d",&n);

   printf("请输入开始报数的人的编号:");

   scanf("%d",&s);

   printf("请输入报数多少个人后结束:");

   scanf("%d",&m);

   printf("\n这%d个人的出圈顺序为:\n\n",n);

  

   Joseph(n,s,m);//调用Joseph函数进行输出

  

   return 0;

}

int Joseph(int n,int s,int m)

{

   int i=0;

   int count=0,group=0;//count控制报数的次数,group用来控制换行和结束报数

   int *a=NULL;//存储n个人的编号

   a=(int *)malloc((n+1)*sizeof(int));//动态分配内存

   if(a==NULL)

   {

      printf("内存申请失败!\n");

      exit(-1);

   }

   a[0]=0;

   for(i=1;i<=n;i++)

      a[i]=i;

   while(1)

   {

      while(1)

      {

         if(a[s]!=0)

         {

            count++;

            if(count!=m) s++;

            else break;

            if(s>n) {s=1;continue;}

            else continue;

         }

         else

         {

            s++;

            if(s>n) {s=1;continue;}

            else continue;

         }

      }

      printf("%5d ",a[s]);

      a[s]=0;count=0;group++;

      if(group==n) {printf("\n\n"); return 0;}

      else

      {

         if(group%10==0) printf("\n");

         else s++;

         if(s>n) {s=1;continue;}

         else continue;

      }

   }

   return 0;

}

posted @ 2009-04-17 11:40  Satyr  阅读(391)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3