高精度算法 -> 数学的竖式运算
高精度加法过程模拟: 123 + 59 1 2 3 + 5 9 ------------------------- 1 7 12 1、个位对齐(数据的末位对齐) stirng a , b; cin>>a>>b; int la = a.size() , lb = b.size(); 将字符串倒置,使得末尾对齐 reverse(a.begin(),a.end()); reverse(b.begin(),b.end()); 2、获取位数、对位相加 int s1[250] , s2[250]; for(int i=0;i<la;i++) s1[i+1] = a[i]-'0'; for(int i=0;i<lb;i++) s2[i+1] = b[i]-'0'; 3、对位相加 int s[250]; 两数相加的最大位数 = max(la , lb) + 1; int len = max(la,lb)+1; for(int i=1;i<=len;i++) s[i] = s1[i] + s2[i]; 4、进位处理 for(int i=1;i<=len;i++) s[i+1] += s[i] / 10 , s[i] %= 10; 5、相加完之后,s[len]有可能是0 -> 数字最高位不能是0 去前导零 while(s[len] == 0 and len > 1) len--; 6、倒置输出 for(int i=len;i>=1;i--) cout<<s[i]; |
高精度减法过程模拟: string a,b; cin>>a>>b; int la = a.size(); int lb = b.size(); 1、判断相减是否会出现负数问题(模拟相减的过程是利用大的数据 - 小的数据) 大的数据 - 小的数据 = a - b if(la == lb and a<b){ cout<<'-'; swap(a,b); }else if(la < lb){ cout<<'-'; swap(a,b); swap(la,lb); } 2、步骤2: 字符串a和字符串b倒置对位 取位数a->s1 , b->s2 (s1、s2分别是int数组) 3、对位相减:int len = max(la,lb); 4、借位处理: for(int i=1;i<=len;i++){ if(s[i]<0){ s[i]+=10; s[i+1]--; } } 5、去前导零 6、倒置输出 |
高精度除法过程模拟: |
高精度乘法过程模拟
#include<bits/stdc++.h> using namespace std; int main(){ //乘的次数以大的为主,累加以小的为主 string a,b; cin>>a>>b; int la = a.size(); int lb = b.size(); //保证a的长度 > b的长度 if(la < lb){ swap(la,lb); swap(a,b); } //倒置对位 //累乘过程:s1->a s2->b c对应累乘结果 -> 长度len = la+lb+1 for(int i=1;i<=lb;i++){ for(int j=1;j<=la;j++){ c[i+j-1] += b[i] * a[i]; } } //进位处理 //去前导零 //倒序输出 return 0; } |