题目描述: 对于一个十进制数A,将A转换为二进制数,然后按位逆序列排列,再转换为十进制数B,B即为A的二进制逆序数。例如,对于十进制数173,其二进制形式为10101101,逆序排列得到10110101,其十进制数为181,181即为173的二进制逆序数。
输入: 一个1000位(即10E999)以内的十进制数
输出: 输入的十进制数的二进制逆序数
测试样例:
输入: 173
输出: 181
C++代码:
#include<iostream>
#include<cstdio>
#include<string>
#include<vector>
using namespace std;
string Divide(string str, int x) //字符串除法。 字符串 str 除以 x 后,返回所得字符串
{
int remainder = 0; //保留余数
for(int i=0; i<str.size(); i++)
{
int current = remainder *10 + str[i] - '0';
str[i] = current / x + '0';
remainder = current % x;
}
int pos = 0;
while(str[pos] == '0') //寻找首个非零下标
{
pos++;
}
return str.substr(pos); // !!! 删除前置多余的0
}
string Multiple(string str, int x) //!!! 字符串乘法。 字符串数str乘以x,返回所得字符串
{
int carry = 0; //保存进位
for(int i=str.size() - 1; i>=0; i--)
{
int current = x * (str[i] - '0') + carry;
str[i] = current % 10 + '0';
carry = current / 10;
}
if(carry != 0) //仍有进位
{
str = "1" + str;
}
return str;
}
string Add(string str, int x) //!!! 字符串加法。 字符串数str加上x,返回所得字符串
{
int carry = x;
for(int i=str.size() - 1; i>=0; i--)
{
int current = (str[i] - '0') + carry;
str[i] = current%10 + '0';
carry = current / 10;
}
if(carry != 0) //仍有进位
{
str = "1" + str;
}
return str;
}
int main()
{
string str;
while(cin>>str)
{
vector<int> binary;
while(str.size() != 0)
{
int last = str[str.size() - 1] - '0';
binary.push_back(last % 2);
str = Divide(str,2);
}
string answer = "0";
int a=0;
for(int i=0; i<binary.size(); ++i) //理解:二进制数转化为十进制数,binary[i]内,从第一个非0的数binary[0]开始,乘以2再加下一位数 binary[0],所得的数乘以2再加上下一位数
{
answer = Multiple(answer, 2); //乘法运算
answer = Add(answer, binary[i]);//加法运算
//a = a * 2 + binary[i]; //注:整形数字可以这么求,现在是字符串数字,需要用上面的 乘法运算 + 加法运算 来循环计算
}
//cout<<a<<endl;
cout<<answer<<endl;
}
return 0;
}
来源:CSDN
作者:Ina_1024
链接:https://blog.csdn.net/qq_38196234/article/details/104572870