已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列,求最后一个出列的人编号是多少。
step 1:定义一个数组, p[j]=j+1;
step 2: 找到每次出圈的人的下标 s=(s+k-1)%n
step 3: 从新的起点开始,每个下标减一,其中,新起点的下标,就是s
如此循环下去
1 #include "stdafx.h" 2 3 #include "iostream" 4 using namespace std; 5 int _tmain(int argc, _TCHAR* argv[]) 6 { 7 8 int n=0; 9 int k; 10 cout<<"Please input the all number:"<<endl; 11 cin>>n; 12 cout<<"Please input the number:out"<<endl; 13 cin>>k; 14 15 int *a = new int[n]; 16 17 int *outarray=new int[n]; 18 19 20 for (int i=0;i<n;i++) 21 { 22 a[i]=i+1; 23 } 24 25 26 27 int s=0; 28 int count=n; 29 30 for (int i=0;i<count-1;i++) 31 { 32 33 s=(s+k-1)%n;//出圈的下标,,也是后面的元素往前移动一位之后,新起点的下标 34 printf("%d ",a[s]); 35 36 //出圈的元素后面所有元素下标都减一 37 for (int j=s;j<n-1;j++) 38 { 39 a[j]=a[j+1]; 40 } 41 n=n-1;//人数总数也减一 42 43 } 44 printf("\n%d",a[0]); 45 46 47 48 49 delete[]a; 50 return 0; 51 }