1. 程式人生 > >★約瑟夫出圈問題(可動態輸入)C/C++

★約瑟夫出圈問題(可動態輸入)C/C++

題目:有n個人圍成一圈,順序排號。從第一個人開始報數,凡報到m的人退出圈子,問最後留下的是原來第幾號的那位?

程式原始碼(C++):

#include<iostream>
using namespace std;

void main()
{
	int *a,n,m;
	cout<<"請輸入兩個數,一個為總人數,一個為每次出圈人編號:\n";
	cin>>n>>m;//表示可以動態輸入
	a=new int[n+1];
	for(int i=0;i<n;i++) //給每個人一個編號
		a[i]=i+1;
	int k=1; //標識處理第k個出圈的人
	i=-1; //下標初值為-1,下一個值0就是第1個人的下標
	cout<<"離開圈子的人依次是:";
	while(1)
	{
		for(int j=0;j<m;) //在圈中數m個人
		{
			i=(i+1)%n;
			if(a[i]!=0) //如果該人在圈中,則數數有效
				j++;
		}
		if(k==n)break;
		cout<<a[i]<<" "; //輸出離開圈子的人編號
		a[i]=0;   //標識該人已離開
		k++;
	}
	cout<<endl<<"勝利者是:"<<a[i]<<"號"<<endl; //輸出勝利者編號
}