#import <Foundation/Foundation.h>
//n表示最初多少人,m表示报出指定的数离开,函数返回最后的人的编号
int Joseph(int n,int m);
int main(int argc, const char * argv[]) {
@autoreleasepool {
int remain = Joseph(15, 3);
printf("%d\n",remain);
}
return 0;
}
int Joseph(int n,int m)
{
int count = n;//当前剩余的人数
int num = 0;//当前报的数
int a[15] = {0};//存放每个人的编号,初始化全为0
int i,j;//i表示当前报数的人对应的下标
for (i=0; i<n; i++)
a[i] = i + 1;//a[i]保存第i个人的编号
i = 0;//从下标为0的人开始报数
while (count>1)
{
num++;
if (num == m)
{
//将下标为i的人删除
for (j=i; j<count-1; j++)
a[j] = a[j+1];
count--;//当前剩余的人数减1
num = 0;//下一个人重新从1开始报数
i -= 1;//当前人的下标减1
}
i = (i+1)%count;//计算下一个要报数的人的下标
}
return a[0];//剩余最后一个人的编号
}
|