18.n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始, 每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。 当一个数字删除后,从被删除数字的下一个继续删除第m个数字。 求出在这个圆圈中剩下的最后一个数字。
题目:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。当一个数字删除后,从被删除数字的下一个继续删除第m个数字。求出在这个圆圈中剩下的最后一个数字。
解题思路:
我们可以从最后一个数入手,我们命名其为last,last在一次又一次的删除中保留下来,直到最后他的位置为0;但随着一次又一次的删除,last的位置也是在不断变化的,我们可以尝试归结last一次删除中变化的规律,以此上推,
n个数的时候第一个被删除的是m-1,假若删除到只剩下n-1个数,我们尝试找到last 在n和n+1中的位置
设上次被删除数字位置为k=m-1
| Y | X |
| k+1 | 0 |
| k+2 | 1 |
| ... | |
| 0 | n-k-1 |
| .... | |
| k-1 | n-2 |
可以有表格看出:
Y=(X+k+1)%n
k=m-1
Y=(X+m)%n
n>1
last(n)=【last(n-1)+m】%n
依次下推,直到只剩余last,这时位置为0
last1=(last0+m)%2
last2=(last1+m)%3
...
lastn=(last(n-1)+m)%n
n=1
last(n)=1;
#include<iostream> using namespace std; int Last(unsigned int n,unsigned int m) { if(n<1||m<1) return -1;//输入错误 int last=0; for(int i=2;i<=n;i++)//从最后一次删除开始 last=(last+m)%i;//最后剩余数last位置为0,上次他的位置=(0+m)%2..n
return last; } int _tmain(int argc, _TCHAR* argv[]) { unsigned int n; unsigned int m; cin>>n>>m; cout<<Last(n,m); system("pause"); return 0; }

浙公网安备 33010602011771号