C語言,陣列實現約瑟夫環問題(兩種方法)
阿新 • • 發佈:2019-01-28
約瑟夫環問題:約瑟夫環是一個數學的應用問題:已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規律重複下去,直到圓桌周圍的人全部出列。
第一種方法:要求將每次出列的人的序號輸出,並輸出最後一個出列的人。
程式碼如下:
//c語言用陣列實現約瑟夫環 #include<stdio.h> #include<stdlib.h> void main() { int y(int n,int m); int p,q,r; printf("請輸入參選人的個數p和開始的位置q:\n"); scanf("%d%d",&p,&q); r=y(p,q); printf("最後那個人的初始位置是:%d\n",r); } int y(int n,int m) { int i,j=0,s=0,l; int *a=(int *)malloc(sizeof(int)); int *b=(int *)malloc(sizeof(int)); for(i=0;i<n;i++) { a[i]=i+1; } a[n]=-1; for(i=0;j!=n;i++) { if(a[i]==-1) i=0; if(a[i]!=0 && a[i]!=-1) s++; if(s==m) { b[j]=a[i]; a[i]=0; j++; s=0; } } for(i=0;i<n;i++) { printf("%5d",b[i]); } printf("\n"); l=b[n-1]; return l; }
執行結果如下,
第二種方法:只要求出最後出列的那個人的位置即可
這種方法利用了約瑟夫環的公式,用到了遞迴,相對簡單。
程式碼如下,
#include<stdio.h> void main() { int y(int n,int m); int a,b,c; scanf("%d%d",&a,&b); c=y(a,b); printf("最後一個數為:%d\n",c); } int y(int n,int m) { int x; if(n==1) x=1; else { x=(y(n-1,m)+m)%n; if(x==0) x=n; } return x; }
執行結果如下,
希望對各位有用。