Josephus問題的一個C語言程式
問題描述:
n個人圍坐一圈,從第一個人開始報數“1,2,3,4….m,數到m的人出局,然後下一個人從1開始繼續,這樣直到最後一個人為勝利者,輸出勝利者是第幾個人。 函數功能:
功能:josep函數,輸入成員數n和停止數m,返回最後留下的人的編號。 代碼:
以下代碼在VS2012平台建立:
#include<stdio.h>#include<stdlib.h>int josep( int , int );int delay();int main(){ int flag=1; while(flag) { int number,point,winner; printf( "************************welcome*************************\n** 遊戲規則:任意幾個人圍坐一圈,從第一個人開始報數 **\n** “1,2,3,4....,數到規定的數位人出局,然後下 **\n** 一個人從1開始繼續,這樣直到最後一個人為勝利者。 **\n********************************************************\n\n請輸入玩家人數(整數):" ); scanf( "%d", & number ); printf( "\n請輸入報數最大值(整數):" ); scanf( "%d", & point ); winner=josep(number,point); printf( "\n\n玩家%d是最終勝利者。\n\n",winner ); flag=3; while (3==flag)//判斷是否重新輸入數字 { printf( "\n\n是否重新輸入數字(1為是,2為否)。\n請輸入:" ); scanf( "%d", & flag ); if (1==flag) flag=1; else if (2==flag) flag=0; else { flag=3; printf( "\n輸入數字錯誤。\n" ); } } } return 0;}int josep( int n , int m ){ int i,j,winner; int *num = ( int * )malloc( n * sizeof(int) );//建立玩家數組 if ( num == NULL ) printf( "記憶體配置錯誤,請重啟程式" ); for ( i=0 ; i<n ; i++)//初始化玩家數組,分別編號。 { num[i]=i+1; } printf( "\n玩家編號完成"); i=0; while ( n > 1 ) { i=( i + m - 1 ) % n;//核心演算法,計算出局人。 printf( "\n玩家%d被淘汰出局",num[i] ); delay(); for ( j=i+1;j<n;j++)//移動座位 num[j-1]=num[j]; n--;//人數減一 if (i==n) i=0; } winner=num[0]; free (num); return winner; }/**延時函數**/int delay(){ int i,j; for (i=0;i<5000;i++) for(j=0;j<5000;j++); return 0;}
控制台介面如下