题目描述
对于一个十进制数A,将A转换为二进制数,然后按位逆序排列,再转换为十进制数B,我们称B为A的二进制逆序数。 例如对于十进制数173,它的二进制形式为10101101,逆序排列得到10110101,其十进制数为181,181即为173的二进制逆序数。
输入描述:
一个1000位(即10^999)以内的十进制数。
输出描述:
输入的十进制数的二进制逆序数。
示例1
输入
复制
173
输出
复制
181
#include<iostream>
using namespace std;
int res[3030];
string Div(string str,int x) { //str整除x的结果 ,最后结果是正着的
string result="";
int temp=0;
int flag=1;
for(int i=0; i<str.length(); i++) {
temp=temp*10+str[i]-'0';
if(temp/x!=0) { //去掉前导零
flag=0;
}
if(flag==0) {
result+=temp/x+'0';
}
temp=temp%x;
}
return result;
}
string Mul(string str,int x) { //str*x,最后结果是倒着的
int temp=0;
string result="";
for(int i=str.length()-1; i>=0; i--) {
temp+=(str[i]-'0')*x;
result+=temp%10+'0';
temp=temp/10;
}
if(temp!=0) {
result+=temp+'0';
}
return result;
}
string Add(string str,int x) { //str+x的结果。最后结果是倒着的
int temp=0;
string res="";
for(int i=str.length()-1; i>=0; i--) {
if(i==str.length()-1) {
temp+=x;
}
temp+=str[i]-'0';
res+=temp%10+'0';
temp=temp/10;
}
if(temp!=0) {
res+=temp+'0';
}
return res;
}
string reserve(string t){
string res="";
for(int i=t.length()-1;i>=0;i--){
res+=t[i];
}
return res;
}
int main() {
string s;
cin>>s;
int k=0;
//十进制转二进制(顺便逆序:得到的res顺序是反的,下一步直接用)
while(s.length()) {
res[k++]=s[s.length()-1]%2;
s=Div(s,2);
}
// cout<<res<<endl;
// int flag=0;
// for(int i=0; i<k; i++) {
// if(res[i]==1) {
// flag=1;
// }
// if(flag==1) {
// cout<<res[i];
// }
//
// }
// cout<<endl;
//二进制转十进制
string temp="0";
for(int i=0; i<k; i++) {
temp=Add(temp,res[i]);
temp=reserve(temp);
// cout<<"+"<<temp<<endl;
if(i!=k-1){
temp=Mul(temp,2);
temp=reserve(temp);
// cout<<"*"<<temp<<endl;
}
}
cout<<temp<<endl;
return 0;
}