7-69 求婚
国王的女儿达西娅要出嫁了,按照当地的风俗,在结婚那天公主从高台上抛下一朵鲜花,花儿落到谁身上,公主就嫁给谁。达西娅担心花儿落不到心上人克俊身上,就和克俊一起商议……。
达西娅找到父亲说:“我不愿意搭台抛花,那么多人挤在一起乱哄哄的。”国王说:“不搭台也行,你必须在结婚当天从求婚人群中选出新郎,但不许指名。”达西娅高兴地找到司仪做了安排。
结婚那天,司仪让求婚者站成一排,克俊数了一下求婚的人数,然后就站到队伍中去了。司仪让求婚者从 1 开始报数,报单数的人退场,留下的人再从 1 开始报数,报单数的人再退场,……,到最后只剩一个人时,众人惊奇地看到这个人正是克俊。
请编写程序,输入求婚的人数 n,输出克俊应该站的位置 p。
输入格式
n
输出格式
p
输入样例
105
输出样例
64
#include <stdio.h>
#include <math.h>
int main() {
long long n, p = 0;
scanf("%lld", &n);
while (pow(2, p) <= n) {
p++;
}
printf("%.0lf\n",pow(2, p-1));
return 0;
}
思路
- 这是一道约瑟夫环问题,但可以使用一个巧方法去计算出答案
- 单数的退场说明这个人一定报偶数,只有2的n次方才会一直报偶数
- 所以找出最大的2的n次方就行