C语言的算法:报数游戏
学技术,重在日拱一卒,一点一滴的积累。
今天,我们一起来分析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();
}
程序运行结果:
页:
[1]