问题 F: 10进制 VS 2进制
时间限制: 1 Sec 内存限制: 32 MB
题目描述
对于一个十进制数A,将A转换为二进制数,然后按位逆序排列,再转换为十进制数B,我们称B为A的二进制逆序数。
例如对于十进制数173,它的二进制形式为10101101,逆序排列得到10110101,其十进制数为181,181即为173的二进制逆序数。
输入
一个1000位(即10^999)以内的十进制数。
输出
输入的十进制数的二进制逆序数。
样例输入
985
样例输出
623
经验总结
按照题目的意思来就行啦~~没有坑~~
AC代码
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct bign
{
int d[1010];
int len;
bign()
{
memset(d,0,sizeof(d));
len=0;
}
}big[110];
bign change(char s[])
{
bign a;
a.len=strlen(s);
for(int i=0;i<a.len;i++)
a.d[i]=s[a.len-i-1]-'0';
return a;
}
void trans(int a[],int n)
{
for(int i=0;i<n/2;i++)
{
int temp=a[i];
a[i]=a[n-1-i];
a[n-1-i]=temp;
}
}
int main()
{
char s[1010];
int mid[10010]={0},out[1010]={0};
while(~scanf("%s",s))
{
bign c=change(s);
int len=0;
while(c.len>0)
{
int re=0;
for(int i=c.len-1;i>=0;i--)
{
int temp=c.d[i]+re*10;
c.d[i]=temp/2;
re=temp%2;
}
mid[len++]=re;
while(c.d[c.len-1]==0)
c.len--;
}
int sum=0;
trans(mid,len);
while(len>0)
{
int re=0;
for(int i=len-1;i>=0;i--)
{
int temp=mid[i]+re*2;
mid[i]=temp/10;
re=temp%10;
}
out[sum++]=re;
while(mid[len-1]==0)
len--;
}
for(int i=sum-1;i>=0;i--)
printf("%d",out[i]);
printf("\n");
}
return 0;
}