http://ac.jobdu.com/problem.php?cid=1040&pid=64
-
题目描述:
-
对于一个十进制数A,将A转换为二进制数,然后按位逆序排列,再转换为十进制数B,我们乘B为A的二进制逆序数。
例如对于十进制数173,它的二进制形式为10101101,逆序排列得到10110101,其十进制数为181,181即为173的二进制逆序数。
-
输入:
-
一个1000位(即10^999)以内的十进制数。
-
输出:
-
输入的十进制数的二进制逆序数。
-
样例输入:
-
173
-
样例输出:
-
181
// 题目65:10进制 VS 2进制.cpp: 主项目文件。
#include "stdafx.h"
#include <cstdio>
#include <cstring>
struct bigInt
{
char str[4003];
void Init(char *nStr)
{
strcpy(str,nStr);
}
bigInt operator /(int k)
{
bigInt res;
int t=0,cnt=0;
bool flag=true;
for(int i=0;str[i];i++)
{
if(flag)
{
if(t*10+(str[i]-'0')>=2)
{
flag=false;
res.str[cnt++]=(t*10+(str[i]-'0'))/k+'0';
t=(t*10+(str[i]-'0'))%k;
}
else
t=str[i]-'0';
}
else
{
res.str[cnt++]=(t*10+(str[i]-'0'))/k+'0';
t=(t*10+(str[i]-'0'))%k;
}
}
if(cnt==0)
res.str[cnt++]='0';
res.str[cnt]='\0';
return res;
}
void changeToBit()
{
bigInt res,tmp;
tmp.Init(str);
if(strcmp(tmp.str,"0")==0)
{
res.Init("0");
return;
}
int cnt=0;
while(strcmp(tmp.str,"0")!=0)
{
str[cnt++]=(tmp.str[strlen(tmp.str)-1]-'0')%2+'0';
tmp=tmp/2;
}
str[cnt]='\0';
}
void changeToShi()
{
}
};
int main()
{
char nStr[1003];
while(scanf("%s",nStr)!=EOF)
{
bigInt res;
res.Init(nStr);
res.changeToBit();
printf("\n");
}
return 0;
}