约瑟夫问题(Josephus Problem)二进制位运算求解【求解速度拉满】
本文为记录算法学习,在《算法设计与分析基础(第三版)》–Anany Levitin著中关于约瑟夫问题的解法中,探讨了关于约瑟夫问题递推式闭式解的最优雅形式(P120)。此文主要为笔者对该算法的代码实现,原理截取原书解答部分。
代码实现如下:
#include<stdio.h>
int main(){
int bit_num=0;
unsigned long long n=0;
unsigned long long _n;
scanf("%llu",&n); //n总人数
_n = n;
// 计算n的有效二进制位数,如14的有效二进制位数为1110(即不包含所有高位零)
while(_n){
_n = _n>>1; //右移一位
++bit_num; //有效位数加一
}
// 循环左移一位
_n = n<<1; //将n左移一位赋给_n
_n = _n^(1<<bit_num); //将上一步左移一位后的结果与将1左移bit_num位的结果异或,主要是为了消掉左移一位的最高位1
_n = _n|1; // 位或1,相当于最低位变为1
//输出结果J(n)
printf("%d\n",_n);
return 0;
}