1樓:bbk臨兵
就是將每一個人的資訊儲存在二維陣列的一個維中。每個人的資訊包含2部分,一部分是他的編號(即最開始他站的位置,作為二維陣列的第一維),另一部分就是他是否還在圈中的標記(1表示在,0表示不在)。
index變數就是用來遍歷每一個人的。array[index]就是編號為index的一個人。array[index][1]就是編號為index的人的狀態(是否還在圈中)。
count用於記錄圈中的當前人數。
當圈中還有1個人以上時,就用if(array[index][1]==1)找到一個還在圈中的人,得到他的index,他報數,temp就加1,當temp為3時,表示這個人報的是3,將他出圈(array[index][1]=0
),將圈中人數減1(count--),並將temp置0,剩下的人重新從1開始報數。index=(index+1+n)%n語句找到下一個人,然後接著迴圈判斷這個人是不是在圈中。。。如此反覆。
但是你這個程式似乎沒有對出圈順序進行輸出。
c語言編寫n個人圍成一圈,按1、2、3報數,報到3的人退出,求最後留在圈中的人是最初n個人中的第幾個(用指
2樓:匿名使用者
此題可用數學方法求解。
設有n個人(編號0~(n-1)),從0開始報數,報到(m-1)的退出,剩下的人繼續從0開始報數 (用數學方法解的時候需要注意應當從0開始編號,因為取餘會取到0解。)
實質是一個遞推,n個人中最終留下來的序號與n-1個人中留下來的人的序號有一個遞推關係式。
假設除去第k個人,則
0, 1, 2, 3, ..., k-2, k-1, k, ..., n-1 // 原始序列 (1)
0, 1, 2, 3, ..., k-2, , k, ..., n-1 // 除去第k人,即除去序號為k-1的人 (2)
k, k+1, ..., n-1, 0, 1, ..., k-2 // 以序號k為起始,從k開始報0 (3)
0, 1, ..., n-k-1, n-k, n-k+1, ..., n-2 // 作編號轉換,此時佇列為n-1人 (4)
變換後就完完全全成為了(n-1)個人報數的子問題,注意(1)式和(4)式,是同一個問題,不同的僅僅是人數。比較(4)和(3),不難看出,0+k=k, 1+k=k+1, ... ,(3)式中'0'後面的數字,
((n-3)+k)%n=k-3,((n-2)+k)%n=k-2, 對於(3)式中'0'前面的數字,由於比n小,也可看作(0+k)%n=k, (1+k)%n=k+1, 故可得出規律:
設(3)中某一數為x' , (4)中對應的數為x,則有:x'=(x+k)%n.
設x為最終留下的人序號時,佇列只剩下1人時,顯然x=0; 此時可向前回溯至2人時x對應的序號,3人時x對應的序號……直至n人時x的序號,即為所求。
#include
const int m = 3;
int main()
3樓:手機使用者
以前做過的,貼一個給你,人數和報的數都可以輸入的 #include#include//應用函式呼叫來實現
void fun_kill(int *pa,int n,int m)i=0;int mcount=0;
int icount=0;
while(icount人數小於總人數if(mcount==m)i++;//報數的同時指標也開始走動if(i==n)}for(i=0;i scanf("%d",&n); printf("請輸入要報的數:"); scanf("%d",&m); int *pkill=(int *)malloc(sizeof(int)*n); fun_kill(pkill,n,m); (c語言程式設計) n 個人圍成一圈,按順序編號。從第 1 到 3 報數 ,凡報到 3 的人退出圈子。 4樓: #include #include #include void main() if(j % 3==0) i++; if(i>=count) i -= count; j++; }for(i=0; i getchar();} 5樓:邪眼王·飛影 int test(int n) }i++; i = i%n; }for (i = 0; i < n; i++)return i;} c語言:有n個人圍成一圈,從第一個人開始報數1、2、3,每報到3的人退出圈子。程式設計使用【連結串列】找出
70 6樓:匿名使用者 #include #include using namespace std; struct node ;int main() else cout<<"請輸入第 "<>(p->code); p->no=i; }p->next=first; //讓表尾指向表頭形成迴圈連結串列p=first; cout<<"出列順序為: "; for (j=1;j<=n;j++) cout< return 0;} c語言有n個人圍成一圈,順序排號。從第一個人開始報數(從1到3報 數)凡報到3的人退出圈子麻煩註釋下** 7樓:凌亂心扉 #include #define n 5//人數 void main() ,i=0,out_n=0,call_n=0,*p; p=a; while(1)//為0(即3)出局 }p++;if(p==a+n)p=a;//迴圈轉向下一人 }printf("最後剩餘者的編號是:%d\n",p+1-a); }printf()函式是格式化輸出函式,一般用於向標準輸出裝置按規定格式輸出資訊。在編寫程式時經常會用到此函式。 函式的原型為:int printf(const char*format,...);函式返回值為整型。若成功則返回輸出的字元數,輸出出錯則返回負值。 printf()函式的呼叫格式為: printf("<;格式化字串》",《參量表》); 其中格式化字串包括兩部分內容:一部分是正常字元;這些字元將按原樣輸出;另一部分是格式化規定字元,以"%"開始,後跟一個或幾個規定字元,用來確定輸出內容格式。 參量表是需要輸出的一系列引數,其個數必須與格式化字串所說明的輸出引數個數一樣多,各引數之間用","分開,且順序一一對應,否則將會出現意想不到的錯誤。 規定符%d十進位制有符號整數 %u十進位制無符號整數 %f浮點數 %s字串 %c單個字元 %p指標的值 %e指數形式的浮點數 %x,%x無符號以十六進位制表示的整數 %o無符號以八進位制表示的整數 %g把輸出的值按照%e或者%f型別中輸出長度較小的方式輸出 %p輸出地址符 %lu 32位無符號整數 %llu 64位無符號整數 8樓: int main(void) i++;///每考察1個位子,無論是否有人都得將位子向後移1位if(i==n)///若已把位子移到最後1人的後面了則將其歸0,重新從頭記數 i=0; } for(i=0;i 三個///後面的是我給你的註釋。不明白續問。 9樓:聽不清啊 void main() i++; //移到下一個位置 if(i==n)i=0; //若超出範圍,重回頭上} //此迴圈結束時,已有n-1人退出圈子for(i=0;i 10樓:匿名使用者 #include #include int main(int argc, char *argv)printf("\n退席的人編號為: "); i=0; count=0; //出列人數---計數mm=1; //從1開始數 while(count=n) //當陣列下標大於總人數時,從0開始,也就是陣列尾接上陣列頭 }return 0;} 11樓: 第一輪: 3的倍數(共33個)去掉,還剩67個 第二輪:3的倍數加1(共33個)去掉,還剩34個第三輪:3的倍數加2(共32個)去掉,還剩2個不好意思,最後必定剩下2個,且最後留下來的是1號和2號(從3開始一直到100不是滿足3的倍數就是滿足3的倍數加1就是滿足3的倍數加2,所以全部被去除) 12樓:象晏盤田然 #include void main() ;//0表示退出圈 子printf("input n:"); scanf("%d", &n); for(i=0; i 0;while (out !=n-1) if(num ==3) i++; if(i ==n) }for(i= 0;i< n;i++)}} 13樓:匿名使用者 #include int main() printf("%d\n",s+1); return 0;} c語言:有n個人圍成一圈,順序排號。從第一個人開始報數(從1到3報 數),凡報到3的人退出圈子, 14樓:矜持№黷 #include #define n 100 void main() i++; if(i==n)i=0; } for(i=0;i 再送點詳解給你 #include #define n 50 // 排隊人數(可任意更改)#define cal 3 //凡報3的人出列(可任意更改)//下面是排隊編號函式:從h 開始的n個人依次編號1到nvoid stdline(int *h,int n)}void main() 15樓:蒼詩蕾魏珺 那就用陣列,對出去的元素標記下。 比如說a[n]=,f[n]= 凡是出去的標上f[i]=1; 這樣就好程式設計了。自己嘗試下吧。 16樓:匿名使用者 #include #define n 100 void main() if(i>=n-1) i=-1;//實現迴圈報數 }for(i=0;i if(a[i]!=0) printf("最後留下來的是第%d號\n",i+1);} 17樓:凌亂心扉 #include #define n 5//人數 void main() ,i=0,out_n=0,call_n=0,*p; p=a; while(1)//為0(即3)出局 }p++;if(p==a+n)p=a;//迴圈轉向下一人 }printf("最後剩餘者的編號是:%d\n",p+1-a); }printf()函式是格式化輸出函式,一般用於向標準輸出裝置按規定格式輸出資訊。在編寫程式時經常會用到此函式。 函式的原型為:int printf(const char*format,...);函式返回值為整型。若成功則返回輸出的字元數,輸出出錯則返回負值。 printf()函式的呼叫格式為: printf("<;格式化字串》",《參量表》); 其中格式化字串包括兩部分內容:一部分是正常字元;這些字元將按原樣輸出;另一部分是格式化規定字元,以"%"開始,後跟一個或幾個規定字元,用來確定輸出內容格式。 參量表是需要輸出的一系列引數,其個數必須與格式化字串所說明的輸出引數個數一樣多,各引數之間用","分開,且順序一一對應,否則將會出現意想不到的錯誤。 規定符%d十進位制有符號整數 %u十進位制無符號整數 %f浮點數 %s字串 %c單個字元 %p指標的值 %e指數形式的浮點數 %x,%x無符號以十六進位制表示的整數 %o無符號以八進位制表示的整數 %g把輸出的值按照%e或者%f型別中輸出長度較小的方式輸出 %p輸出地址符 %lu 32位無符號整數 %llu 64位無符號整數 有120種 5 4 3 2 1 120種 我暈,你這分不好拿啊,就一種 因為是 一個圈 10個人圍成一個圓圈,有多少種不同的排法?10個人排隊的排法 10 假設其中一個人是隊首,因為圍成圓圈,所以隊首在任何地方都已一樣的,也就是同一種排法被重複了10次,所以結果是 10 10 9 n個人圍成一圈和排... 自圓其說z yu n q shu 釋義 自己把論點表達得圓滿 周全。形容不露破綻。圓 使圓滿 說 觀點 論點。語出 清 李寶嘉 官場現形記 躊躇了半天 只得仰承憲意 自圓其說道 職道的話原是一時愚昧之談 作不得準的。正音 說 不能讀作 shu 辨形 圓 不能寫作 園 近義 無懈可擊 滴水不漏 天衣無... 64號。第一輪,留下的是二的倍數,第二輪留下的是四的倍數 最後一輪留下的是2 6 64的倍數。只有總人數為bai2的正整數次冪時 2 du4 8 16 編號zhi最大的人才能最後dao留下 回 於是知道,當45號小朋答友報 1 的時候,剩下的小朋友 含45號 正好是2的正整數次冪 45號為開始時,4...5人圍成一圈就坐,有多少種不同的方法
看圖猜成語可字圍成一圈答案是什麼
小朋友圍成一圈,並依次編為1 100號。從第1號開始1至2報數