/**
* 編程題: 1.設(shè)編號為1,2,… n的n個(gè)人圍坐一圈,約定編號為k(1<=k<=n)的人從1開始報(bào)數(shù),數(shù)到m 的那個(gè)人出列,它的下一位又從1開始報(bào)數(shù),數(shù)到m的那個(gè)人又出列,依次類推,直到所有人出列為止,由此產(chǎn)生一個(gè)出隊(duì)編號的序列。
*
* @param n n個(gè)人
* @param m 數(shù)到m那個(gè)人出列
* @param k 初始編號,第一次從這個(gè)人開始數(shù)
*/
+(void)run:(int)n andm:(int)m andk:(int)k
{
NSMutableArray *mArr = [NSMutableArray new];//原始數(shù)據(jù)數(shù)組
NSMutableArray *newmArr = [NSMutableArray new];//所有人出列后的編號順序數(shù)組
//從k這個(gè)人開始報(bào)數(shù),所以減1
k --;
//初始編號按順序加入數(shù)組
for (int i = 1; i<=n; i++)
{
[mArr addObject:@(i)];
}
//循環(huán)
do {
//從1開始報(bào)數(shù),報(bào)到m則停止
for (int j = 1; j<m; j++)
{
k++;//下一個(gè)人
//報(bào)數(shù)到最后一個(gè)人,則回到第一個(gè)人繼續(xù)報(bào)
if (k>=mArr.count)
{
k=0;
}
}
//如果k(數(shù)到m的人)大于總?cè)藬?shù),則對當(dāng)前總?cè)藬?shù)取余
if (k>mArr.count)
{
k=k%mArr.count;
}
//數(shù)到m的人加入新數(shù)組,然后出列(從原數(shù)組刪除)
NSString *temp = mArr[k];
[newmArr addObject:@([temp intValue])];
[mArr removeObjectAtIndex:k];
//如果數(shù)到m的人剛好為最后一個(gè),則k置為0(下次報(bào)數(shù)從0開始)
if (k == mArr.count)
{
k=0;
}
} while (mArr.count>0);//原始數(shù)組里面還有元素則繼續(xù)循環(huán)
NSLog(@"%@",newmArr);
}
main函數(shù)里面調(diào)用:
[run run:10 andm:5 andk:2];
運(yùn)行結(jié)果:

Paste_Image.png