- 积分
- 115
- 鸿鹄币
- 个
- 好评度
- 点
- 精华
- 注册时间
- 2022-7-25
- 最后登录
- 1970-1-1
- 阅读权限
- 20
- 听众
- 收听
助理工程师
|
学技术,重在日拱一卒,一点一滴的积累。
今天,我们一起来分析C语言的算法:报数游戏。
算法题目:假设一共有n个人玩游戏,编号分别为1~n,手动输入一个小于n的数w,则从1开始查数,当数到w的时候,则此编号的人退出游戏,然后下一个人重新开始从1报数,,直到所有人都退出游戏,求退出玩家的编号依次为什么?
例如:有5人玩游戏,w为2,则退出顺序为2 4 1 5 3。
编程思路
编程思路:
1、根据题目要求,需要输入两个数n和m,当每次到m的时候,就有人退出,然后再重新开始报数1~m。
2、可以通过要求,理解为将1~n编号从1开始循环,到m之后对应编号退出,再重新开始循环,那么为了达到以上目的,可以通过设置链表的方式来存储编号,同时将链表的首位连接,构成闭环的链表。
3、通过闭环的链表,我们就可以不断的循环n次,在每次循环里面再循环m次,每次退出一人,然后在while循环中执行n减减操作,直到所有人退出完毕,结束循环。
程序范例
#include <stdio.h>
#include <stdlib.h> 
struct ele
{
  int no;
  struct ele *link;
};
int n,m,i;
main()
{
  struct ele *h,*u,*p;
  system("cls");
  printf("请输入 n (一共有多少人完游戏)和 m(报几个数出去一个人):\n");
  scanf("%d%d",&n,&m);
  h=u=(struct ele *)malloc(sizeof(struct ele));
  h->no=1;
  for(i=2;i<=n;i++)
  {
    u->link=(struct ele *)malloc(sizeof(struct ele));
    u=u->link;
    u->no=i;
  }
  u->link=h;
  puts("\n依次退出循环的人数是:");
while(n)
{
  for(i=1;i<m;i++)
  u=u->link;
  p=u->link;
  u->link=p->link;
  printf("%4d",p->no);
  free(p);
  n--;
}
printf("\n\n Press any key to quit...\n");
getch();
}
程序运行结果:
|
|