前言
高精度,就是利用数据结构来模拟变量,来为了防止变量的局限性影响程序运行的操作。以下,我将以字符串的形式输入各数数位:
#include <string>
···
string arr,brr;
cin>>arr>>brr;
利用数据结构来进行系列的数学运算,如高精度加,高精度减等……
1.怎么实现?
用字符串的各位来模拟草稿的计算过程:
串名 \ 下标 | 0 | 1 | 2 | 3 |
---|---|---|---|---|
arr | 4 | 3 | 2 | 1 |
brr | 1 | 2 | 3 | 4 |
+运算后 | ||||
arr | 5 | 5 | 5 | 5 |
-运算后 | ||||
arr | 3 | 0 | 8 | 7 |
2.诶,有坑
2.1. 数位对齐怎么对?
数组下标与数字各位的对照表:
下标: | 0 | 1 | 2 |
---|---|---|---|
/ | 1(百位) | 2(十位) | 3(个位) |
/ | 1(十位) | 2(个位) | / |
明显,数位不对齐
我们的解决方案是(bgm)——数组倒置
如下:
下标: | 0 | 1 | 2 |
---|---|---|---|
/ | 3(个位) | 2(十位) | 1(百位) |
/ | 2(个位) | 1(十位) | / |
一般的简单方法是倒序输出
当然我们可以如下方式完成倒序的操作:
void Inversion(int dsa[],string asd,int asddsa) {
for(int i=0;i<asddsa;i++) dsa[asddsa-i]=asd[i]-'0';
}
OK对齐了
2.2. 减法结果为负怎么办?
有一个操作如下:
式a - b
= - [ - ( a - b ) ]
= - [ - a + b ]
= - [ b - a ]
那么,我们这样处理:
int CompareSize(string asd,string bsd) {
int lenasd=asd.size(),lenbsd=bsd.size();
if(lenasd>lenbsd) return 1;
else if(lenbsd>lenasd) return 2;
else for(int i=0;i<lenasd;i++) {
if(asd[i]>bsd[i]) return 1;
if(asd[i]<bsd[i]) return 2;
}
return 0;
}
2.3. 哦,对了
1. 进 位 和 退 位 均 可 以 通 过 设 置 变 量 参 与 运 算 来 解 决
2. 运 算 时 记 得 字 符 ascii 值 的 参 与
3.代码如下:
void Inversion(int dsa[],string asd,int asddsa) {
for(int i=0;i<asddsa;i++) dsa[asddsa-i]=asd[i]-'0';
}
int CompareSize(string asd,string bsd) {
int lenasd=asd.size(),lenbsd=bsd.size();
if(lenasd>lenbsd) return 1;
else if(lenbsd>lenasd) return 2;
else for(int i=0;i<lenasd;i++) {
if(asd[i]>bsd[i]) return 1;
if(asd[i]<bsd[i]) return 2;
}
return 0;
}
string add(string arr,string brr) {
string crr;
int len1=arr.size(),len2=brr.size(),tmp=0,a[5005]={},b[5005]={};
Inversion(a,arr,len1);
Inversion(b,brr,len2);
int c[5005]={},len3=max(len1,len2);
for(int i=1;i<=max(len1,len2);i++) {
c[i]=a[i]+b[i]+tmp;
if(c[i]>9)
tmp=1,c[i]-=10;
else
tmp=0;
}
if(tmp) c[max(len1++,len2++)]=1;
while(c[len3]==0 && len3>1) len3--;
while(len3>=1) crr+=c[len3--]+'0';
return crr;
}
string sub(string arr,string brr) {
string crr;
int len1=arr.size(),len2=brr.size(),a[5005]={},b[5005]={};
Inversion(a,arr,len1);
Inversion(b,brr,len2);
int flag=CompareSize(arr,brr);
if(flag==0) return "0";
if(flag==2) {
crr+='-';
swap(arr,brr);
swap(len1,len2);
}
int c[5005]={},len3=len1;
for (int i=1;i<=len1;i++) {
if (a[i]<b[i]) {
c[i+1]--;
a[i]+=10;
}
c[i]=a[i]-b[i];
}
while(c[len3]==0 && len3>1) len3--;
while(len3>=1) crr+=c[len3--]+'0';
return crr;
}