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; }

 

posted @ 2017-12-07 20:24  茶夜  阅读(348)  评论(0)    收藏  举报