九度oj的1208:
-
题目描述:
-
对于一个十进制数A,将A转换为二进制数,然后按位逆序排列,再转换为十进制数B,我们乘B为A的二进制逆序数。
例如对于十进制数173,它的二进制形式为10101101,逆序排列得到10110101,其十进制数为181,181即为173的二进制逆序数。
-
输入:
-
一个1000位(即10^999)以内的十进制数。
-
输出:
-
输入的十进制数的二进制逆序数。
-
样例输入:
-
173
-
样例输出:
-
181
<span style="font-size:18px;">#include <iostream>
using namespace std;
typedef string::size_type st;
typedef pair<string,int> DivideResult;
DivideResult BigDivide(string s,int m,int n){
int r = 0;
for(st i = 0;i<s.size();++i){
int tmp = ((s[i]-'0')+r*m)/n;
r = ((s[i]-'0')+r*m)%n;
s[i] = tmp +'0';
}
string ret;
string::iterator beg = s.begin();
for(;beg!=s.end();++beg){
if(*beg!='0'){
break;
}
}
if(beg == s.end())
ret = "0";
else{
ret.assign(beg,s.end());
}
return make_pair(ret,r);
}
string mton (string s, int m, int n){
string tmp;
st i = 0;
DivideResult dr;
do{
dr = BigDivide(s,m,n);
tmp.push_back(dr.second+'0');
s = dr.first;
}while(dr.first!="0");
string ret(tmp.rbegin(),tmp.rend());
return ret;
}
int main(){
string s;
while(cin>>s){
string binary = mton(s,10,2);
string rev(binary.rbegin(),binary.rend());
string ret = mton(rev,2,10);
cout<<ret<<endl;
}
return 0;
}</span>
结果:
/**************************************************************
Problem: 1208
User: SmilingPig
Language: C++
Result: Accepted
Time:60 ms
Memory:1520 kb
****************************************************************/
函数mton返回以m进制表示的大整数的n进制。主要思想还是模仿普通的进制转换。
功能比较简陋,不能实现10进制以上进制的转换。