问题:n个数排一个圈,从编号1开始删除,以后每m个数删一次,问最后一个被删除的数。2<=n<+10000, 1<=k<=10000
#include<iostream>
using namespace std;
int main()
{
int n, m, w;
while (cin>>n>>m, n + m)
{
w = 0;
for (int i = 2; i <= n; i++)
w = (w + m) % i;//下一个开始位置
printf("%d %d %d\n", n, m, w + 1);
}
return 0;
}
变形:从第k个数开始删。
#include<iostream>
using namespace std;
#define MAXN 10000 + 10
int f[MAXN];
int main()
{
int n, k, m;
while (cin>>n>>k>>m)
{
f[1] = 0;
for (int i = 2; i<=n; i++) f[i] = (f[i - 1] + m) % i;//找出f[n]
int ans = (k - m + 1 + f[n]) % n;//处理从k开始删除的位置问题
if (ans <= 0) ans += n;//是负数就加一圈
cout<<ans<<endl;
}
return 0;
}