链接:https://www.nowcoder.com/questionTerminal/fd972d5d5cf04dd4bb4e5f027d4fc11e
来源:牛客网
对于一个十进制数A,将A转换为二进制数,然后按位逆序排列,再转换为十进制数B,我们称B为A的二进制逆序数。 例如对于十进制数173,它的二进制形式为10101101,逆序排列得到10110101,其十进制数为181,181即为173的二进制逆序数。
输入描述:
一个1000位(即10^999)以内的十进制数。
输出描述:
输入的十进制数的二进制逆序数。
输入
173
输出
181
注意:进位是 str="1"+str 而不是str+="1"
思路:手动模拟除法 乘法 加法
除法--->十进制变二进制---->不断地÷2 %2
乘法---->二进制变十进制---->不断地 ×2+本位
以(1101)的二进制变十进制为例 (俺不知道图片怎么转过来【哭唧唧~~~】知道的麻烦跟俺说一声)
#include<iostream>
#include<cstdio>
#include<string>
#include<vector>
using namespace std;
string Divide(string str,int x){//字符串除法
int remainer=0;//保存余数
for(int i=0;i<str.size();i++){
int current=remainer*10+str[i]-'0';//被除数
str[i]=current/x+'0';//商
remainer=current%x;
}
int pos=0;
while(str[pos]=='0'){
pos++;
}
return str.substr(pos); //去除前置0
}
string Multiply(string str,int x){//字符串乘
int carry=0;//进位
for(int i=str.size()-1;i>=0;i--){
int current=(str[i]-'0')*x+carry;
str[i]=current%10+'0';
carry=current/10;
}
if(carry!=0){//如果最终还有进位
str="1"+str;
}
return str;
}
string Add(string str,int 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);
}
//binary里已经是逆序的了
string answer="0";
for(int i=0;i<binary.size();i++){
string current=Multiply(answer,2);
answer=Add(current,binary[i]);
}
cout<<answer<<endl;
}
return 0;}