题目来源:问题 F: 10进制 VS 2进制
题目描述
对于一个十进制数A,将A转换为二进制数,然后按位逆序排列,再转换为十进制数B,我们称B为A的二进制逆序数。
例如对于十进制数173,它的二进制形式为10101101,逆序排列得到10110101,其十进制数为181,181即为173的二进制逆序数。
输入
一个1000位(即10^999)以内的十进制数。
输出
输入的十进制数的二进制逆序数。
样例输入
985
样例输出
623
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
int main()
{
char m[1010];
while (~scanf("%s", m))
{
int num = 0;
int n[10010];
int k = strlen(m);
int len = strlen(m);
int n1[1010];
//把十进制变成二进制
while (len > 0)
{
int r = 0; //r为余数
for (int i = 0; i < k; i++) //从高位开始
{
r = r * 10 + (m[i] - '0'); //和上一位遗留的余数组合,得到临时的被除数
if (r < 2)
{
m[i] = 0 + '0';
}
else
{
m[i] = r / 2 + '0';
r = r % 2;
}
}
n[num++] = r;
while (m[k - len] == '0')
{
len--;
}
}
//把二进制变成十进制
k = len = num;
num = 0;
while (len > 0)
{
int r = 0; //r为余数
for (int i = 0; i < k; i++) //从高位开始
{
r = r * 2 + n[i]; //和上一位遗留的余数组合,得到临时的被除数
if (r < 10)
{
n[i] = 0;
}
else
{
n[i] = r / 10;
r = r % 10;
}
}
n1[num++] = r;
while (n[k - len] == 0)
{
len--;
}
}
for (int i = num - 1; i >= 0; i--)
{
printf("%d", n1[i]);
}
printf("\n");
}
return 0;
}