panda_eater @ 2017-07-09 09:07:26
这里说一下我的思路。
对于一个十进制数x,假设x=11
二进制拆分以后答案应为1101(暂时忽略前导0)
那么我可以把这个数右移k位,再左移k位。相当于删除了二进制表示中从后往前的k位数
得到四个数
1101 ...1
1100 ...2
1100 ...3
1000 ...4
用1-2得到从右往左的第1位,2-3得到从右往左第2位,3-4得到第3位,4就是第4位。
然后这些数再进行右移得到每一位是0或者1,高位到低位输出。
写了个源程序,可以支持把输入的一个数二进制拆分。答案根据程序的思路来输出,但是莫名WA掉...
请求同学帮忙检查,感激不尽。
//checker
#include<bits/stdc++.h>
#define fo(i,j,k) for(i=j;i<=k;i++)
using namespace std;
const int mxn=5005;
int x[mxn];
int main()
{
freopen("nodes6.out","w",stdout);
int i,j;
scanf("%d",&x[1]);
// printf("I\n");
fo(i,2,32)
{
x[i]=x[1]>>(i-1);
// printf("> 1 %d\n",i-1);
}
fo(i,33,63)
{
x[i]=x[i-31]<<(i-32);
// printf("< %d %d\n",i-31,i-32);
}
fo(i,64,94)
{
x[i]=-x[i-31];
// printf("- %d\n",i-31);
}
x[95]=x[1]+x[64];//printf("+ 1 64\n");
fo(i,96,125)
{
x[i]=(x[i-63]+x[i-31]);
// printf("+ %d %d\n",i-63,i-31);
}
int cnt=30,tmp=125;
fo(i,126,156)
{
// printf("> %d %d\n",tmp,cnt);
x[i]=x[tmp]>>cnt;
tmp--,cnt--;
}
// puts("O 32");
// fo(i,126,156) printf("O %d\n",i);
printf("ANS\n\n");
printf("%d",x[32]);
fo(i,126,156) printf("%d",x[i]);
return 0;
}