问题 F: 10进制 VS 2进制
时间限制: 1 Sec 内存限制: 32 MB题目描述
对于一个十进制数A,将A转换为二进制数,然后按位逆序排列,再转换为十进制数B,我们称B为A的二进制逆序数。
例如对于十进制数173,它的二进制形式为10101101,逆序排列得到10110101,其十进制数为181,181即为173的二进制逆序数。
输入
一个1000位(即10^999)以内的十进制数。
输出
输入的十进制数的二进制逆序数。
样例输入
985
样例输出
623
参考博客:
点击打开链接http://blog.csdn.net/guojiaqi007/article/details/54573200
#include<stdio.h>
#include<string.h>
struct bign
{
int d[1005];
int len;
bign()
{
memset(d,0,sizeof(d));
len=0;
}
};
int main()
{
char str[1005]={0};
while(gets(str)!=NULL)
{
bign ten,two;
int len=strlen(str);
for(int i=0;i<len;i++)
ten.d[i]=str[i]-'0';
ten.len=len;
while(true)
{
int i=0;
while(i<len&&ten.d[i]==0) //清除前导0
i++;
if(i==len)
break;
int carry=0; //借位
for(;i<len;i++)
{
int tmp=carry*10+ten.d[i];
ten.d[i]=tmp/2;
carry=tmp%2;
}
two.d[two.len++]=carry; //余数
}
if(!two.len)
printf("0\n");
else
{
ten.len=0;
while(true)
{
int i=0;
while(i<two.len&&two.d[i]==0)
i++;
if(i==two.len)
break;
int carry=0;
for(;i<two.len;i++)
{
int tmp=carry*2+two.d[i];
two.d[i]=tmp/10;
carry=tmp%10;
}
ten.d[ten.len++]=carry;
}
for(int i=ten.len-1;i>=0;i--)
printf("%d",ten.d[i]);
putchar('\n');
}
}
return 0;
}