约瑟夫环

来源:互联网 发布:淘宝详情代码生成器 编辑:程序博客网 时间:2024/06/05 03:55

百度搜索约瑟夫问题

递推式是:
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;}
0 0
原创粉丝点击