约瑟夫问题特殊场景下的特殊解法
Posted 从善若水
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了约瑟夫问题特殊场景下的特殊解法相关的知识,希望对你有一定的参考价值。
本人就职于国际知名终端厂商,负责modem芯片研发。
在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。
约瑟夫问题特殊场景下的特殊解法
首先明确特殊场景是什么?
是指步长为2的约瑟夫问题
Code
#include<stdio.h>
int main(void)
{
int bit_num=0;
unsigned long long n=0;
unsigned long long _n;
scanf("%llu",&n);//n总人数
_n = n;
while(_n>>=1) ++bit_num;
_n = n^(1<<bit_num);
_n = (_n<<1)|1;
printf("_n %d\\n",_n);
return 0;
}
原理解释
在step=2的约瑟夫问题下,我们发现问题的解与样本容量的二进制表示有关,例如:
n=100,step=2下,最终的答案是73
首先我们看一下100的二进制形式(1100100)2 ,我们将(1100100)2循环左移一位得到(1001001)2= 73就是最终的解
这个原理的证明可以通过数学归纳法证明
性能比较
使用你的code运行 n = 121542168489541231651 , step=2
看一下多久可以得到结果,注意变量应该设置为 unsigned long long 类型
正确结果59754567
本人使用网上的code运行上面的测试用例,等到海枯石烂都没有结果,所有没有给出比较数据,只知道使用本人的code可以瞬间得出结果
以上是关于约瑟夫问题特殊场景下的特殊解法的主要内容,如果未能解决你的问题,请参考以下文章