PKU 1220 大数进制转换 m进制转成n进制
对大数的进制转换,可以不用大数的除法运算。
假设要把一个二进制数1011,转换成一个三进制数。
1、用二进制数的第一位1去除以3,商为0,余数是1
2、由于前面一位的除法结果有余数,所以要把余数*(进制)+该为数字。对于本例,就是1(余数)*2(进制)+0(当前这位的数值)=2。除以3后,商0,余数是2
3、同2所述,2(余数)*2(进制)+1(当前这位的数值)=5。5除以3后,商1,余数2
4、同2所述,2(余数)*2(进制)+1(当前这位的数值)=5。5除以3后,商1,余数2
以上四步可以表示为 1011(2-based) / 3(要转换成的基数) = 0011(2-based 商).. 2(3-based 余数)
然后再让0011除以3,重复以上步骤,直到商为0。每次的余数的逆序就是以3为基的数。
1011/3 -->0011 ..2
0011/3 -->0001 ..0
0001/3 -->0000 ..1
所以,1011(2-based) --> 102(3-based)
参考http://acm.pku.edu.cn/JudgeOnline/problem?id=1220
假设要把一个二进制数1011,转换成一个三进制数。
1、用二进制数的第一位1去除以3,商为0,余数是1
2、由于前面一位的除法结果有余数,所以要把余数*(进制)+该为数字。对于本例,就是1(余数)*2(进制)+0(当前这位的数值)=2。除以3后,商0,余数是2
3、同2所述,2(余数)*2(进制)+1(当前这位的数值)=5。5除以3后,商1,余数2
4、同2所述,2(余数)*2(进制)+1(当前这位的数值)=5。5除以3后,商1,余数2
以上四步可以表示为 1011(2-based) / 3(要转换成的基数) = 0011(2-based 商).. 2(3-based 余数)
然后再让0011除以3,重复以上步骤,直到商为0。每次的余数的逆序就是以3为基的数。
1011/3 -->0011 ..2
0011/3 -->0001 ..0
0001/3 -->0000 ..1
所以,1011(2-based) --> 102(3-based)
参考http://acm.pku.edu.cn/JudgeOnline/problem?id=1220
#include
<
iostream
>
#include < algorithm >
#include < vector >
#include < string >
using namespace std;
char index[ 62 ] = {
' 0 ' , ' 1 ' , ' 2 ' , ' 3 ' , ' 4 ' , ' 5 ' , ' 6 ' , ' 7 ' , ' 8 ' , ' 9 ' ,
' A ' , ' B ' , ' C ' , ' D ' , ' E ' , ' F ' , ' G ' , ' H ' , ' I ' , ' J ' ,
' K ' , ' L ' , ' M ' , ' N ' , ' O ' , ' P ' , ' Q ' , ' R ' , ' S ' , ' T ' ,
' U ' , ' V ' , ' W ' , ' X ' , ' Y ' , ' Z ' , ' a ' , ' b ' , ' c ' , ' d ' ,
' e ' , ' f ' , ' g ' , ' h ' , ' i ' , ' j ' , ' k ' , ' l ' , ' m ' , ' n ' ,
' o ' , ' p ' , ' q ' , ' r ' , ' s ' , ' t ' , ' u ' , ' v ' , ' w ' , ' x ' ,
' y ' , ' z ' };
int getValue( char ch)
{
if (ch >= ' 0 ' && ch <= ' 9 ' ) return ch - ' 0 ' ;
else if (ch >= ' A ' && ch <= ' Z ' ) return ch - ' A ' + 10 ;
else return ch - ' a ' + 36 ;
}
string change( int from, int to, string input)
{
string res = "" ,tmp = "" ;
int remainder,pos;
while (input.length() != 0 )
{
remainder = 0 ;
for (pos = 0 ;pos < input.length();pos ++ )
{
remainder = remainder * from + getValue(input[pos]);
if (remainder < to)
{
tmp = tmp + ' 0 ' ;
continue ;
}
else
{
tmp = tmp + index[remainder / to];
remainder %= to;
}
}
res = index[remainder] + res;
for (pos = 0 ;pos < tmp.length() && tmp[pos] == ' 0 ' ;pos ++ );
input = tmp.substr(pos);
tmp = "" ;
}
return res;
}
int main()
{
int t,from,to;
string num;
cin >> t;
while (t -- )
{
cin >> from >> to >> num;
cout << from << " " << num << endl;
cout << to << " " << change(from,to,num) << endl << endl;
}
}
#include < algorithm >
#include < vector >
#include < string >
using namespace std;
char index[ 62 ] = {
' 0 ' , ' 1 ' , ' 2 ' , ' 3 ' , ' 4 ' , ' 5 ' , ' 6 ' , ' 7 ' , ' 8 ' , ' 9 ' ,
' A ' , ' B ' , ' C ' , ' D ' , ' E ' , ' F ' , ' G ' , ' H ' , ' I ' , ' J ' ,
' K ' , ' L ' , ' M ' , ' N ' , ' O ' , ' P ' , ' Q ' , ' R ' , ' S ' , ' T ' ,
' U ' , ' V ' , ' W ' , ' X ' , ' Y ' , ' Z ' , ' a ' , ' b ' , ' c ' , ' d ' ,
' e ' , ' f ' , ' g ' , ' h ' , ' i ' , ' j ' , ' k ' , ' l ' , ' m ' , ' n ' ,
' o ' , ' p ' , ' q ' , ' r ' , ' s ' , ' t ' , ' u ' , ' v ' , ' w ' , ' x ' ,
' y ' , ' z ' };
int getValue( char ch)
{
if (ch >= ' 0 ' && ch <= ' 9 ' ) return ch - ' 0 ' ;
else if (ch >= ' A ' && ch <= ' Z ' ) return ch - ' A ' + 10 ;
else return ch - ' a ' + 36 ;
}
string change( int from, int to, string input)
{
string res = "" ,tmp = "" ;
int remainder,pos;
while (input.length() != 0 )
{
remainder = 0 ;
for (pos = 0 ;pos < input.length();pos ++ )
{
remainder = remainder * from + getValue(input[pos]);
if (remainder < to)
{
tmp = tmp + ' 0 ' ;
continue ;
}
else
{
tmp = tmp + index[remainder / to];
remainder %= to;
}
}
res = index[remainder] + res;
for (pos = 0 ;pos < tmp.length() && tmp[pos] == ' 0 ' ;pos ++ );
input = tmp.substr(pos);
tmp = "" ;
}
return res;
}
int main()
{
int t,from,to;
string num;
cin >> t;
while (t -- )
{
cin >> from >> to >> num;
cout << from << " " << num << endl;
cout << to << " " << change(from,to,num) << endl << endl;
}
}