解题思路:
1.设立标记数组num[n],当前小朋友编号为i。如果小朋友淘汰,num[i]=0;如果小朋友还在游戏中,num[i]=1。
2.从1开始报数,当前报数报到k,如果当前数t%k==0,表示为k的倍数,淘汰;如果t%10==k,表示个位数为k,淘汰,num[i]=0。
3.循环寻找下一个没被淘汰的小朋友编号,直到只有一个小朋友没被淘汰,游戏结束
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,k;
cin>>n>>k;
int num[n+1]; // 标记小朋友是否被淘汰
int nn=n; //剩余小朋友数量
for(int i=1;i<=n;i++) num[i]=1; //开始时所有小朋友都在游戏中
int t=1; //当前报数的数字
int i=1; //当前小朋友编号
while(1)
{
if(nn==1) //只剩一个小朋友
{
cout<<i; //输出小朋友编号
break;
}
if(t%k==0||t%10==k)
{
num[i]=0; //小朋友淘汰
nn--;
}
int flag=0; //标记小朋友是否被找到
for(int j=i+1;j<=n;j++) //先向后遍历寻找
{
if(num[j]==1)
{
i=j;
flag=1; //找到
break;
}
if(j==n) //如果向后没找到,则进入下一个循环,从头寻找编号
{
for(int k=1;k<=n;k++)
{
if(num[k]==1)
{
i=k;
flag=1;
break;
}
}
}
}
if(flag==0) //还没找到,即就是前一个小朋友编号为n,那么只能从头找
{
for(int j=1;j<=n;j++)
{
if(num[j]==1)
{
i=j;
break;
}
}
}
t++; //报数的数字加一
}
return 0;
}