约瑟夫环
在问题的基础上再演变一下,如果是n 个人(编号 1...n),先去掉第 m 个数,然后从 m+1个开始报 1,报到 k 的退出,剩下的人继续从 1 开始报数.求胜利者的编号.
int main(void){ int n, k, m; while( scanf("%d%d%d", &n, &k, &m), n || k || m ){ int i, d, s=0; for( i=2; i <= n; ++i ) s = (s+k)%i; k = k%n; if( k == 0 ) k=n; d = (s+1) + (m-k); if( d >= 1 && d <= n ) printf("%d\n", d); else if( d < 1 ) printf("%d\n", n+d); else if( d > n ) printf("%d\n", d%n); } return 0; }