目录
- 高精度博客 - 前两讲
- 高精度减法
- 高精度除法
- 高精度系列函数完整版
高精度博客 - 前两讲
讲次名称 | 链接 |
---|---|
高精加法 | [C++] 高精度加法(作用 + 模板 + 例题) |
高精乘法 | [C++] 高精度乘法 |
高精度减法
void subBIG(int x[], int y[], int z[]){
z[0] = max(x[0], y[0]);
for(int i = 1; i <= z[0]; i++) z[i] = x[i] - y[i];
for(int i = 1; i <= z[0]; i++){
if(z[i] < 0){
z[i] += 10;
z[i + 1]--;
}
}
while(z[z[0]] == 0 && z[0] > 1) z[0]--;
}
这个函数的思路还是在模拟列竖式, 最后的while是删除前缀0(以免出现类似000000
的结果, 仅返回0
)
高精度除法
记忆版
void divBIG(int x[],int y,int z[]){
z[0] = x[0];
int r = 0;
for(int i = z[0]; i >= 1; i--){
int t = r * 10 + x[i];
z[i] = t / y;
r = t % y;
}
while(z[z[0]] == 0 && z[0] > 1) z[0]--;
}
讲解版
void divBIG(int x[],int y,int z[]){
z[0] = x[0]; // 有效位数设置
// 模拟列竖式
int r = 0;
for(int i = z[0]; i >= 1; i--){ // 倒序循环
int t = r * 10 + x[i];
z[i] = t / y;
r = t % y;
}
while(z[z[0]] == 0 && z[0] > 1) z[0]--; // 去除前导零
}
高精度系列函数完整版
我们的3讲高精度即将结束, 给出完整的函数代码~
void s2BIG(string s, int a[]){
int len = s.size();
for(int i = 1; i <= len; i++){
a[i] = s[len - i] - '0';
}
a[0] = len;
}
void i2BIG(int n, int a[]){
int cur = 0;
while(n > 0){
cur++;
a[cur] = n % 10;
n /= 10;
}
if(cur == 0) cur++;
a[0] = cur;
}
void printBIG(int a[]){
int len = a[0];
for(int i = len; i > 0; i--){
cout << a[i];
}
cout << endl;
}
void addBIG(int x[], int y[], int z[]){
z[0] = max(x[0], y[0]);
for(int i = 1; i <= z[0]; i++)
z[i] = x[i] + y[i];
for(int i = 1; i <= z[0]; i++){
z[i + 1] += z[i] / 10;
z[i] %= 10;
if(z[z[0] + 1] != 0)
z[0]++;
}
}
/*
如果x比y小, 则返回true
否则(y >= x)返回false
*/
bool cmpBIG(int x[], int y[]){
int lx = x[0], ly = y[0];
if(lx != ly) return lx < ly;
for(int i = lx; i >= 1; i--){
if(x[i] != y[i]) return x[i] < y[i];
}
return false;
}
void mulBIG(int x[], int y[], int z[])
{
for (int i = 1; i <= x[0]; i++)
{
for (int j = 1; j <= y[0]; j++)
{
z[i + j - 1] += x[i] * y[j];
}
}
z[0] = max(x[0], y[0]);
for (int i = 1; i <= z[0]; i++)
{
z[i + 1] += z[i] / 10;
z[i] %= 10;
if (z[z[0] + 1] > 0) z[0]++;
}
while (z[z[0]] == 0 && z[0] > 1) z[0]--;
}
void subBIG(int x[], int y[], int z[]){
z[0] = max(x[0], y[0]);
for(int i = 1; i <= z[0]; i++) z[i] = x[i] - y[i];
for(int i = 1; i <= z[0]; i++){
if(z[i] < 0){
z[i] += 10;
z[i + 1]--;
}
}
while(z[z[0]] == 0 && z[0] > 1) z[0]--;
}
void divBIG(int x[],int y,int z[]){
z[0] = x[0];
int r = 0;
for(int i = z[0]; i >= 1; i--){
int t = r * 10 + x[i];
z[i] = t / y;
r = t % y;
}
while(z[z[0]] == 0 && z[0] > 1) z[0]--;
}