高精度算是我高中期间没有学明白的知识点之一,其实挺简单的东西。核心思路是【按位模拟竖式运算】,说白了就是模拟题。
加法减法从低位到高位模拟,因为会进位借位
乘法也从低到高因为进位
除法要从高到低因为我们手算除法时也是从高到低保留余数的。
高精度减法:https://www.luogu.org/problemnew/show/P2142
1 #include<iostream> 2 using namespace std; 3 4 string a1,b1; 5 int a[10005],b[10005],temp[10005];//由低位到高位 6 int ans[10005]; 7 bool biga=false,bigb=false; 8 9 int main(){ 10 cin>>a1>>b1; 11 for(int i=0;i<a1.length();i++) a[a1.length()-i] =int(a1[i])-48; 12 for(int i=0;i<b1.length();i++) b[b1.length()-i] = int(b1[i])-48; 13 14 if(a1.length()>b1.length()) biga=true; 15 else if(b1.length()>a1.length()) bigb=true; 16 else{ 17 for(int i=a1.length();i>=1;i--){ 18 if( a[i]>b[i] ) { biga=true; break; } 19 else if( b[i]>a[i] ) { bigb=true; break; } 20 } 21 if(!biga && !bigb) { cout<<0; return 0; } 22 } 23 int length=max(a1.length(),b1.length());//要考虑这么多上下相减 24 25 if(bigb){ 26 for(int i=1;i<=length;i++) temp[i]=a[i]; 27 for(int i=1;i<=length;i++) a[i]=b[i]; 28 for(int i=1;i<=length;i++) b[i]=temp[i]; 29 } 30 31 for(int i=1;i<=length;i++){ 32 ans[i] += a[i]-b[i]; 33 if(ans[i]<0) { ans[i]+=10; ans[i+1]-=1; } 34 } 35 int len=length; 36 for(int i=length;i>=1;i--) { 37 if( ans[i]==0 ) len--; 38 else break; 39 } 40 if(bigb) cout<<"-"; 41 for(int i=len;i>=1;i--) cout<<ans[i]; 42 43 return 0; 44 }
高精度加法:https://www.luogu.org/problemnew/show/P1601
1 #include<iostream> 2 using namespace std; 3 4 string a1,b1; 5 int a[505],b[505];//由低位到高位 6 int ans[505]; 7 8 int main(){ 9 cin>>a1>>b1; 10 for(int i=0;i<a1.length();i++) a[a1.length()-i] =int(a1[i])-48; 11 12 for(int i=0;i<b1.length();i++) b[b1.length()-i] = int(b1[i])-48; 13 14 int length=max(a1.length(),b1.length());//要考虑这么多上下相加 15 for(int i=1;i<=length;i++){ 16 ans[i] += a[i]+b[i]; 17 if(ans[i]>9) { ans[i]-=10; ans[i+1]=1; } 18 } 19 if(ans[length+1]!=0) length+=1; 20 for(int i=length;i>=1;i--) cout<<ans[i]; 21 22 return 0; 23 }
原文地址:https://www.cnblogs.com/ZhenghangHu/p/9339111.html
时间: 2024-10-19 17:01:50