說到“敢死隊”,大家不要以為我來介紹電影了,因為數據結構里真有這么道程序設計題目,原題如下:
有M個敢死隊員要炸掉敵人的一個碉堡,誰都不想去,排長決定用輪回數數的辦法來決定哪個戰士去執行任務。如果前一個戰士沒完成任務,則要再派一個戰士上去。現給每個戰士編一個號,大家圍坐成一圈,隨便從某一個戰士開始計數,當數到5時,對應的戰士就去執行任務,且此戰士不再參加下一輪計數。如果此戰士沒完成任務,再從下一個戰士開始數數,被數到第5時,此戰士接著去執行任務。以此類推,直到任務完成為止。
這題本來就叫“敢死隊”。“誰都不想去”,就這一句我覺得這個問題也只能叫“不敢死隊問題”。今天大家就要完成這道不敢死隊問題。我們假設排長是1號,按照上面介紹,從一號開始數,數到5的那名戰士去執行任務,那么排長是第幾個去執行任務的?
輸入包括多試數據,每行一個整數M(0<=M<=10000)(敢死隊人數),若M==0,輸入結束,不做處理。
輸出一個整數n,代表排長是第n個去執行任務。
962230Example Output
26132#include <stdio.h>#include <stdlib.h>struct node{ int data; struct node* next;};struct node* Createlist(int n){/*創建一個循環鏈表*/ struct node* head,*tail,*p; int i; head=(struct node*)malloc(sizeof(struct node)); head->data=1;/*頭結點的值域不為空*/ 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;/*將尾指針指向頭結點,構成循環鏈表*/ 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為標記標量,用來記錄指針走過的結點數*/ if(flag%5==0) {/*當k對5取余等于0時,要么派出排長,要么刪掉當前結點*/ if(p->data==1) { printf("%d/n",flag/5); break; } else { t=head; while(t->next!=p)/*尋找當前結點的前一個結點*/ t=t->next; t->next=p->next;free(p);/*刪除當前結點*/ } } } }}
新聞熱點
疑難解答