约瑟夫环
百度搜索约瑟夫问题
递推式是:
J(2k)=2J(k)-1
J(2k+1)=2J(k)+1
但是其实最优雅的方法就是用位数
我们可以对n本身做一次向左的循环移位来得到J(n)
例如:j(6)=j(110)=101=5
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n;
scanf("%d",&n);
int num[16],k;
int *p=NULL;
int i=0;
while(n)
{
num[i]=n%2;
i++;
n=n/2;
}
p=(int *)malloc(i*sizeof(int));
for(k=0;k<i;k++)
{
p[k]=num[i-k-1];
}
int tm=p[0];
for(k=1;k<i;k++)
{
p[k-1]=p[k];
}
p[i-1]=p[0];
int sum=0;
for(k=0;k<i;k++)
{
sum=sum*2+p[k];
}
printf("%d",sum);
free(p);
return 0;
}