#include <stdio.h>
#include <stdlib.h>
void update(int* a,int n, int i);
int main()
{
int n , m,i,j=0;
scanf("%d %d",&n,&m);
int a[n];
for(i=0;i<n;i++)
a[i]=i+1;
for(i=0;;i++)
{
j++;
if(i==n)
i=0;
if(j==m)
{
update(a,n,i);
j=1;
n--;
}
if(i==n)
i=0;
if(n==1)
break;
}
printf("%d",a[0]);
return 0;
}
void update(int* a,int n, int i)
{
for(;i<n-1;i++)
a[i]=a[i+1];
}
解释:
1.第一个for循环:把所有的序号存入数组中
2.变量j用作计数,每数m个后,j发生变化
3.第一个if循环,当需要数到末尾的时候,修正下标i的值
4.第二个if,当数到指定位置时,更新数组,消除该标号,此时i指向已删除的标号的下个值,并把j置为1,总数n减一
5.第三个if,用于判断若删除的数是最后一个值,修正下标i的值
6.第四个if,当只剩一个数的时候,循环停止。