1857: 【提高】bonbon

内存限制:16 MB 时间限制:1.000 S
评测方式:文本比较 命题人:
提交:0 解决:0

题目描述

 N 个人在操场上围成一圈,将这N 个人按顺时针方向从1到N编号,然后,从第一个人起,每隔一个人让下一个人离开操场,显然,第一轮过后,具有偶数编号的人都离开了操场。依次做下去,直到操场 上只剩下一个人,记这个人的编号为J(N) ,例如,J(5)=3 ,J(10)=5 ,等等。你的任务是对于键盘输入的N,编一个递归函数求出J(N)。

输入

  从键盘输入一个正整数N,N不超出长整型数longint的范围。

输出

输出一个正整数,表示操场上剩下的最后一个人的编号。

样例输入 复制

10

样例输出 复制

5

提示

 如果N为偶数,第一轮过后,具有偶数编号的人都离开了操场,剩下的奇数编号的人还有N/2个,此时还是从第一个人起,每隔一个人让下一个人离开操场,这个问题与原问题本质相同,规模变小了, 所以我们可以用递归的方法来处理,只要将剩下的人重新编号:
    1 3 5 7 9 ......第一轮过后剩下的人的编号
    1 2 3 4 5 ......对剩下的人重新编号
    重新编号后的问题就成了一个N/2个人的问题,它的结果为J(N/2),它与J(N)的关系为J(N)=J(N/2)*2-1,如 样例要求的J(10)=J(5)*2-1=3*2-1=5。
    对于N为奇数的情况,你可以参照以上的分析得出相似的结论,最后得出完整的递归式,递归终止条件为J(1)=1。

来源/分类