學技術,重在日拱一卒,一點一滴的積累。
今天,我們一起來分析C語言的算法:報數(shù)游戲。
算法:假設一共有n個人玩游戲,編號分別為1~n,手動輸入一個小于n的數(shù)w,則從1開始查數(shù),當數(shù)到w的時候,則此編號的人退出游戲,然后下一個人重新開始從1報數(shù),,直到所有人都退出游戲,求退出玩家的編號依次為什么?
例如:有5人玩游戲,w為2,則退出順序為2 4 1 5 3。
編程思路
編程思路:
1、根據(jù)題目要求,需要輸入兩個數(shù)n和m,當每次到m的時候,就有人退出,然后再重新開始報數(shù)1~m。
2、可以通過要求,理解為將1~n編號從1開始循環(huán),到m之后對應編號退出,再重新開始循環(huán),那么為了達到以上目的,可以通過設置鏈表的方式來存儲編號,同時將鏈表的首位連接,構成閉環(huán)的鏈表。
3、通過閉環(huán)的鏈表,我們就可以不斷的循環(huán)n次,在每次循環(huán)里面再循環(huán)m次,每次退出一人,然后在while循環(huán)中執(zhí)行n減減操作,直到所有人退出完畢,結束循環(huá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(報幾個數(shù)出去一個人):\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依次退出循環(huán)的人數(shù)是:");
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.jpg (24.63 KB, 下載次數(shù): 79)
下載附件
2022-10-12 09:16 上傳
|