进制转换方法:
1.N进制转十进制:
假设有个一个N进制数X: (xn … x0)N , 求X的十进制表示:
法一:
按权展开;
res = x0 * N^0 + x1 * N^1 + … + xn * N^n;
法二:
秦九韶算法;
res = res * N + xi;
2.十进制转N进制:
假设有一个十进制数X, 求其N进制表示;
短除法:
对X不断除N取余知道除数为0, 最后余数反转得到N进制表示;
特殊的: 将M进制X转N进制;
法一:
将X先转为十进制数, 再将十进制数转成N进制数;
法二:
短除法;
对M进制数X执行短除法除N, 直至除数X为0, 最后余数反转得到N进制表示;
在对X进行除法的过程产生的计算由十进制完成, 而除法的结果则是M进制;
M进制数a转b进制,短除法
//m进制除法,r为余数
void div(int m, vector<int> &a, int b, int &r)
{
vector<int> c;
r = 0;
for (int i = a.size() - 1; i >= 0; i--)
{
r = r * m + a[i];
c.push_back(r / b);
r %= b;
}
reverse(c.begin(), c.end());
while (c.size() && c.back() == 0) c.pop_back();
a = c;
}
//m进制数a,转为b进制表示
string ma_tob(int m, vector<int> &a, int b)
{
string res = "";
while (a.size())
{
int r;
div(m, a, b, r); //短除法
res = get_char(r) + res;
}
return res;
}
m进制数a的读入方法
string a;
cin >> a;
vector<int> A;
for (int i = a.size() - 1; i >= 0; i--)
A.push_back(get_num(a[i]));
十进制转b进制(低精度版本)
string 10_to_b(int a, int b)//a为10进制数
{
string res;
while (a)
{
res = get_char(a % b) + res;
a /= b;
}
return res;
}
字符转换函数(10-16分别为ABCDEF)
int get_num(char t)
{
if (t <= '9' && t >= '0') return t - '0';
return t - 'A' + 10;
}
char get_char(int t)
{
if (t <= 9 && t >= 0) return t + '0';
return t + 'A' - 10;
}