c语言问题:

设有n(n<=100)个人,其编号为:1,2,3,4.。。n,按编号顺序顺时针方向坐成一圈,每个人手持一个正整数密码(自己任意输入),开始任选一个正整数m,从第一个人开始... 设有n(n<=100)个人,其编号为:1,2,3,4.。。n,按编号顺序顺时针方向坐成一圈,每个人手持一个正整数密码(自己任意输入),开始任选一个正整数m,从第一个人开始按顺时针方向报数,报到m时停止,报m的人出列,并将其手中的密码作为新的m值,从他的下一个人开始从1报数,以此类推,直到所有人出列。用c语言编写,求高手!!! 展开
 我来答
276506968
2012-07-17 · TA获得超过777个赞
知道小有建树答主
回答量:83
采纳率:0%
帮助的人:81.1万
展开全部

void main()

{

 int n[100],num=0,i=0,p,q,j,k,m;         //数组n存num个数,num为手动输入,i为当前位置           

 printf("总共有多少人?:\n");

 scanf("%d",&num);              //输入人数num;

 for(q=0;q<num;q++)           //随机数产生他们手里的值

  n[q]=rand()%num + 1;

 printf("号 手里\n");

 for(q=0;q<num;q++) 

  printf("%d  %d\n",q+1,n[q]);

 printf("\n输入一个m:");//第一个m

 scanf("%d",&m); 

  for(j=0;j<num-1;j++)    //踢出的人,全部记为0

  {

     for(k=0;k<m-1;k++)//让循环跑m-1次找到第三个人(因为最后k还是++一次的)

     {

  while(n[i]==0)//如果手里是0的话,这个人被T出了,不能算在队列里,所以找到TA时候第一个不是0的(还有效的人)

  {

   i++;

   if(i==num)

    i=0;

  }

  i++;

  while(n[i]==0)//算下一位,同样要判断这个人还有没有效

  {

   i++;

   if(i==num)

    i=0;

  }

  if(i==num)//如果是数组最后一位的后一位,那么就是数组第一个。之后也会判断第一个有没有效

    i=0;

  printf("报数%d,当前m:%d\n",k+1,m);

     }

  printf("找到了第m个,它手里的值为%d\n",n[i]);

  m=n[i];

     n[i]=0;

  }

 for(p=0;p<num;p++)       //输出最后不为0,也就是最后剩下的那位

  if(n[p]!=0)

   printf("还剩下一个人:%d\n",n[p]);

 system("PAUSE");

}

 

 

泪流满面~希望能帮到楼主您啊!参考了以前我回答的一个程序。

 

意法半导体(中国)投资有限公司
2023-06-12 广告
单片机,即单片微控制器,也称为单片微型计算机,是将中央处理器(CPU)、存储器(ROM,RAM)、输入/输出接口和其他功能部件集成在一块 在一个小块的集成电路上,从而实现对整个电路或系统的数字式控制。单片机不是完成某一个逻辑功能的芯片,而是... 点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
原野yxivy
2012-07-17 · TA获得超过138个赞
知道小有建树答主
回答量:233
采纳率:0%
帮助的人:136万
展开全部
每个人手持一个正整数密码(自己任意输入)?是几位数?范围?
还有你需要的结果是什么?所有密码序列吗?
既然是任意数,而且人数也不确定,有可能构成死循环
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
燕血联华
2012-07-17 · TA获得超过742个赞
知道小有建树答主
回答量:92
采纳率:0%
帮助的人:105万
展开全部


这就是josephus问题的变式。

代码如下:链表实现(其中s为开始报数的人,n为总人数,m同题)

#include<stdio.h>

#include<stdlib.h>

typedef struct lst

{

       int data;

       struct lst *next;

}LST;

main()

{

       LST *p=NULL,*q=NULL,*head=NULL;

       int i=0,n=0,m=0,s=0,k=0,j=0;

       printf("please input n: ");

       fflush(stdin);

       scanf("%d",&n);         //clearn screen

       printf("please input m: ");

       fflush(stdin);

       scanf("%d",&m);

       printf("please input s: ");

       fflush(stdin);

       scanf("%d",&s);

       if(n==0||m==0||s==0) 

              printf("  0  ");

       else

       { 

          head=(LST *)malloc(sizeof(LST));

          head->next=NULL;

          k=n;

          q=head;

          q->data=1;

         if(n<=0) exit;

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

        {

            p=(LST *)malloc(sizeof(LST));

            p->next=NULL;

            q->next=p;

            p->data=i;

           q=p;

       }

     q->next=head;

     p=head;

     if(p->data!=s)

         p=p->next;

      do

      {

          for(j=1;j<m-1;j++)

          p=p->next;

          q=p;

          p=p->next;

          q->next=p->next;

           m=p->data;

           printf(" %d ",p->data);

           free(p);

           k--;

          p=q->next;

     }while(k!=0);

  }

 getch();

}

 运行如下:



   

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wodinnigefei00
2012-07-17
知道答主
回答量:14
采纳率:0%
帮助的人:7.3万
展开全部
.......
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式