出圈问题

已知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 }

 

转载于:https://www.cnblogs.com/persistentlyworking/archive/2013/05/10/3069266.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值