11.6 进制转换(正整数)
(1) 十进制变 N 进制
短除法:不断地除 N,直到那个数变成 1。把所有的余数连接到一起,就是转换后的 N 进制数。
// bit[]是对应的N进制位,top是N进制下的最后一位数字的序号(从0开始)
void convertTo(int num, int base, int *bit, int &top)
{
top=-1;
do
{
bit[++top] = num%base; // 可直接输出num%base
num/=base;
} while (num>0);
}
(2) N 进制变十进制
大家应该知道怎样将 N 进制转变为十进制。现在,用秦九韶算法进行计算。
// bit[]是对应的N进制位,top是N进制下的最后一位数字的序号(从0开始)
// 返回值是十进制数。
int convertFrom(int base, int *bit, int top)
{
int ans=0;
for (int i=top; i>=0; i--)
{
ans*=base;
ans+=bit[i];
}
return ans;
}
11.7 高精度算法(压位存储)!
有的时候,数字会大到连 long long 都不能承受的程度。这时,我们可以自己模拟大数的各种运算。
所谓压位存储,就是在高精度数内部采用 10000 进制(即每四位放到一个数中)进行存储。它与 10 进制(即一个数位对应一个数)相比速度要快一些。
高精度数内部也可以采用 100000000 进制,但是这样就不能计算乘除法了。
(1) 定义
编程时这样做——假设 hp 是高精度类型。
先用宏定义:#define hp long long①,然后集中精力编写算法代码。
最后直接删除这条宏定义,把真正的高精度算法写出来。这样做的好处是无需再修改算法代码,减小了维护代价。
const int MAX=100;
struct hp
{
int num[MAX];
hp & operator = (const char*);
hp & operator = (int);
hp();
hp(int);
// 以下运算符可以根据实际需要来选择。
bool operator > (const hp &) const;
bool operator < (const hp &) const;
bool o