說(shuō)到“敢死隊(duì)”,大家不要以為我來(lái)介紹電影了,因?yàn)閿?shù)據(jù)結(jié)構(gòu)里真有這么道程序設(shè)計(jì)題目,原題如下:
有M個(gè)敢死隊(duì)員要炸掉敵人的一個(gè)碉堡,誰(shuí)都不想去,排長(zhǎng)決定用輪回?cái)?shù)數(shù)的辦法來(lái)決定哪個(gè)戰(zhàn)士去執(zhí)行任務(wù)。如果前一個(gè)戰(zhàn)士沒完成任務(wù),則要再派一個(gè)戰(zhàn)士上去?,F(xiàn)給每個(gè)戰(zhàn)士編一個(gè)號(hào),大家圍坐成一圈,隨便從某一個(gè)戰(zhàn)士開始計(jì)數(shù),當(dāng)數(shù)到5時(shí),對(duì)應(yīng)的戰(zhàn)士就去執(zhí)行任務(wù),且此戰(zhàn)士不再參加下一輪計(jì)數(shù)。如果此戰(zhàn)士沒完成任務(wù),再?gòu)南乱粋€(gè)戰(zhàn)士開始數(shù)數(shù),被數(shù)到第5時(shí),此戰(zhàn)士接著去執(zhí)行任務(wù)。以此類推,直到任務(wù)完成為止。
這題本來(lái)就叫“敢死隊(duì)”。“誰(shuí)都不想去”,就這一句我覺得這個(gè)問(wèn)題也只能叫“不敢死隊(duì)問(wèn)題”。今天大家就要完成這道不敢死隊(duì)問(wèn)題。我們假設(shè)排長(zhǎng)是1號(hào),按照上面介紹,從一號(hào)開始數(shù),數(shù)到5的那名戰(zhàn)士去執(zhí)行任務(wù),那么排長(zhǎng)是第幾個(gè)去執(zhí)行任務(wù)的?
輸入包括多試數(shù)據(jù),每行一個(gè)整數(shù)M(0<=M<=10000)(敢死隊(duì)人數(shù)),若M==0,輸入結(jié)束,不做處理。
輸出一個(gè)整數(shù)n,代表排長(zhǎng)是第n個(gè)去執(zhí)行任務(wù)。
962230Example Output
26132#include <stdio.h>#include <stdlib.h>struct node{ int data; struct node* next;};struct node* Createlist(int n){/*創(chuàng)建一個(gè)循環(huán)鏈表*/ struct node* head,*tail,*p; int i; head=(struct node*)malloc(sizeof(struct node)); head->data=1;/*頭結(jié)點(diǎn)的值域不為空*/ head->next=NULL; tail=head; for(i=2;i<=n;i++) { p=(struct node*)malloc(sizeof(struct node)); p->data=i; p->next=NULL; tail->next=p; tail=p; } tail->next=head;/*將尾指針指向頭結(jié)點(diǎn),構(gòu)成循環(huán)鏈表*/ return head;};void main(){ int n,flag; struct node* head,*p,*t; while(scanf("%d",&n)!=EOF&&n!=0) { head=Createlist(n); for(p=head,flag=1;;p=p->next,flag++) {/*k為標(biāo)記標(biāo)量,用來(lái)記錄指針走過(guò)的結(jié)點(diǎn)數(shù)*/ if(flag%5==0) {/*當(dāng)k對(duì)5取余等于0時(shí),要么派出排長(zhǎng),要么刪掉當(dāng)前結(jié)點(diǎn)*/ if(p->data==1) { printf("%d/n",flag/5); break; } else { t=head; while(t->next!=p)/*尋找當(dāng)前結(jié)點(diǎn)的前一個(gè)結(jié)點(diǎn)*/ t=t->next; t->next=p->next;free(p);/*刪除當(dāng)前結(jié)點(diǎn)*/ } } } }}
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注