19 約瑟夫環2

問題描述 :

明明是一名公安局的談判專家,專門負責和綁匪談判。有一次,明明接到一個特殊的任務,他趕到了案發現場,發現有k個綁匪綁架了k個人質,於是明明就開始和綁匪進行談判。綁匪提出了一個非常特殊的要求,如果明明能夠回答出這個問題,那綁匪將釋放所有的人質;否則,綁匪就要撕票。 綁匪的問題是這樣:綁匪把人質和自己圍成一個圈,把人質從1開始編號,一直編到k,然後綁匪自己從k+1開始編號,一直編到2k。現在從編號1開始,每次從其中選出第m個人(隔m-1選出一個人)出列,然後綁匪要求明明選定這個m值,且m值要儘量的小,使得最先出列的k個人都是綁匪。 例如:有3個壞人和3個人質,他們排成一圈,其中編號1到3的爲人質,編號4到6的爲壞人,如下: 1、2、3、4、5、6; 明明要選定m=5時,能夠滿足綁匪的要求。因爲: 第一輪,從1開始數,編號5出列,剩下的人爲: 1、2、3、4、6; 第二輪,從6開始數,編號4出列,剩下的人爲: 1、2、3、6; 第三輪,從6開始數,編號6出列,剩下的人爲: 1、2、3; 這樣所有的綁匪都先出列,明明可以成功地救出所有的人質。 如果明明能夠找到這個m值,那麼所有的人質都想獲救,否則的話,後果不堪設想。明明意識到了問題的嚴重,這個問題對他來說十分地棘手。於是明明想到了你,你是一名程序設計專家,明明想讓你用程序來解這個問題,救出所有的人質。 明明的問題可以歸結爲:假設有k個人質和k個綁匪圍成一圈。人質的編號從1到k,綁匪的編號從k+1到2k。從編號1開始,每次從其中選出第m個人(隔m-1選出一人)出列。希望求出m的最小值,使得最先出列的k個人都是綁匪,即都是編號從k+1到2k的人。

輸入說明 :

你寫的程序要求從標準輸入設備中讀入測試數據作爲你所寫程序的輸入數據。標準輸入設備中有多組測試數據,每組測試數據僅一行,每組測試數據有一個整數k(1≤k≤10),表示人質的人數和綁匪的人數。每組測試數據與其後一組測試數據之間沒有任何空行,第一組測試數據前面以及最後一組測試數據後面也都沒有任何空行。

輸出說明 :

對於每一組測試數據,你寫的程序要求計算出一組相應的運算結果,並將這一組運算結果作爲你所寫程序的輸出數據依次寫入到標準輸出設備中。每組運算結果爲一個整數m,即明明要選定的那個數。每組運算結果單獨形成一行數據,其行首和行尾都沒有任何空格,每組運算結果與其後一組運算結果之間沒有任何空行,第一組運算結果前面以及最後一組運算結果後面也都沒有任何空行。 注:通常,顯示屏爲標準輸出設備。

輸入範例 :

1
2
3
5

輸出範例 :

2
7
5
169
c源碼:

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
int main()
{
  int i,j,n,a[100],z,m,t;
   while(scanf("%d",&n)!=EOF)
   {


     for(i=1;i<=2*n;i++)
	 { 
	    a[i]=i;//初始化數組
	 }
  m=1;
  z=1;
  t=2*n;
  while(1)
  {
 for(j=1;j<=n;j++)//保證循環n次,即綁匪次
   {	z = (z+m-1) % t;
		if (z==0)// 從1開始,整除是爲啊a[2*n]; 
			z=t;
	 if(a[z]>=n+1&&a[z]<=2*n)//人質始終不變,去除綁匪
	 {
	    for(i=z;i<t;i++)
			a[i]=a[i+1];//已刪除z號綁匪
		t--;//總人數減少
	 }
   else
   {  m++;//m累加
        z=1; //還原數據
       t=2*n;
	   for(i=1;i<=2*n;i++)
	 { 
		 a[i]=i;
	 }
	   break;//退出循壞
   }//else
	}//for

    if(j>n)//循環n次,全部綁匪已刪除,退出while循壞
		break;
  }	//while(1)
	 printf("%d\n",m);
   }//大while循環
  return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章