高精度运算
Posted 远见望远
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高精度运算相关的知识,希望对你有一定的参考价值。
一、高精度加法
高精度加法是模拟竖式运算得来,总结如下:
1.对字符串进行预处理
2.两个数组对应位置分别相加
3.从低位到高位扫描一遍,超过进制的向上进位
4.如果最高位大于进制,则向上进位
1 string s1,s2; 2 int a[10001],b[10001],c[10001]={}; 3 int la,lb,lc; 4 void high_precision_addition() 5 { 6 if(s1<s2) 7 { 8 swap(s1,s2); 9 } 10 la=s1.length(); 11 lb=s2.length(); 12 for(int i=0;i<la;i++) 13 { 14 a[la-i]=s1[i]-‘0‘; 15 } 16 for(int i=0;i<lb;i++) 17 { 18 b[lb-i]=s2[i]-‘0‘; 19 } 20 lc=la; 21 for(int i=1;i<=lb;i++) 22 { 23 c[i]=a[i]+b[i]; 24 } 25 for(int i=lb+1;i<=la;i++) 26 { 27 c[i]=a[i]; 28 } 29 for(int i=1;i<lc;i++) 30 { 31 if(c[i]>=10) 32 { 33 c[i+1]+=c[i]/10; 34 c[i]%=10; 35 } 36 } 37 while(c[lc]>=10) 38 { 39 lc+=1; 40 c[lc]=c[lc-1]/10; 41 c[lc-1]%=10; 42 } 43 return; 44 }
二、高精度减法
1.对字符串进行预处理,判断正负,记录正负号,调整被减数和减数,使得被减数不小于减数
2.对应位置分别相减
3.从低位到高位扫描,小于0的向上一位借1
4.如果最高位是0,减小结果长度lc
1 string s1,s2; 2 bool negative; 3 int a[10001],b[10001],c[10001]={}; 4 int la,lb,lc; 5 void high_precision_subtraction() 6 { 7 negative=false; 8 if(s1.length()<s2.length()) 9 { 10 swap(s1,s2); 11 negative=true; 12 } 13 if(s1.length()==s2.length()) 14 { 15 if(s1<s2) 16 { 17 swap(s1,s2); 18 negative=true; 19 } 20 } 21 la=s1.length(); 22 lb=s2.length(); 23 lc=la; 24 for(int i=0;i<la;i++) 25 { 26 a[la-i]=s1[i]-‘0‘; 27 } 28 for(int i=0;i<lb;i++) 29 { 30 b[lb-i]=s2[i]-‘0‘; 31 } 32 for(int i=1;i<=lb;i++) 33 { 34 c[i]=a[i]-b[i]; 35 } 36 for(int i=lb+1;i<=la;i++) 37 { 38 c[i]=a[i]; 39 } 40 for(int i=1;i<lc;i++) 41 { 42 while(c[i]<0) 43 { 44 c[i+1]-=1; 45 c[i]+=10; 46 } 47 } 48 while(c[lc]==0&&lc>0) 49 { 50 lc-=1; 51 } 52 if(lc==0) 53 { 54 lc=1; 55 } 56 return; 57 }
三、高精度乘法
1 string s1,s2; 2 int a[10001],b[10001],c[10001]={}; 3 int la,lb,lc; 4 void high_precision_multiplication() 5 { 6 if(s1<s2) 7 { 8 swap(s1,s2); 9 } 10 la=s1.length(); 11 lb=s2.length(); 12 for(int i=0;i<la;i++) 13 { 14 a[la-i]=s1[i]-‘0‘; 15 } 16 for(int i=0;i<lb;i++) 17 { 18 b[lb-i]=s2[i]-‘0‘; 19 } 20 lc=la+lb-1; 21 for(int i=1;i<=lb;i++) 22 { 23 for(int j=0;j<la;j++) 24 { 25 c[i+j]+=a[j+1]*b[i]; 26 } 27 } 28 for(int i=1;i<lc;i++) 29 { 30 if(c[i]>=10) 31 { 32 c[i+1]+=c[i]/10; 33 c[i]%=10; 34 } 35 } 36 while(c[lc]>=10) 37 { 38 lc++; 39 c[lc]=c[lc-1]/10; 40 c[lc-1]%=10; 41 } 42 return; 43 }
四、高精度除法
1 string s1,s2; 2 int a[10001],b[10001],c[10001]={}; 3 int la,lb,lc; 4 long long division; 5 void subtraction() 6 { 7 for(int i=1;i<=lb;i++) 8 { 9 c[i]=a[i]-b[i]; 10 } 11 for(int i=lb+1;i<=la;i++) 12 { 13 c[i]=a[i]; 14 } 15 for(int i=1;i<lc;i++) 16 { 17 while(c[i]<0) 18 { 19 c[i+1]-=1; 20 c[i]+=10; 21 } 22 } 23 while(c[lc]==0&&lc>0) 24 { 25 lc-=1; 26 } 27 if(lc==0) 28 { 29 lc=1; 30 } 31 return; 32 } 33 void high_precision_division() 34 { 35 if(s1.length()<s2.length()) 36 { 37 lc=1; 38 return; 39 } 40 if(s1.length()==s2.length()&&s1<s2) 41 { 42 lc=1; 43 return; 44 } 45 la=s1.length(); 46 lb=s2.length(); 47 lc=la; 48 for(int i=0;i<la;i++) 49 { 50 a[la-i]=s1[i]-‘0‘; 51 } 52 for(int i=0;i<lb;i++) 53 { 54 b[lb-i]=s2[i]-‘0‘; 55 } 56 division=0; 57 while(true) 58 { 59 subtraction(); 60 division+=1; 61 for(int i=1;i<=lc;i++) 62 { 63 a[i]=c[i]; 64 c[i]=0; 65 } 66 la=lc; 67 if(la<lb) 68 { 69 break; 70 } 71 if(la==lb) 72 { 73 int tmpa=la,tmpb=lb; 74 bool flag=false; 75 while(tmpa>=1&&tmpb>=1) 76 { 77 if(a[tmpa]<b[tmpb]) 78 { 79 flag=true; 80 break; 81 } 82 tmpa-=1; 83 tmpb-=1; 84 } 85 if(flag) 86 { 87 break; 88 } 89 } 90 } 91 return; 92 }
五、高精度取余
1 string s1,s2; 2 int a[10001],b[10001],c[10001]={}; 3 int la,lb,lc; 4 void subtraction() 5 { 6 for(int i=1;i<=lb;i++) 7 { 8 c[i]=a[i]-b[i]; 9 } 10 for(int i=lb+1;i<=la;i++) 11 { 12 c[i]=a[i]; 13 } 14 for(int i=1;i<lc;i++) 15 { 16 while(c[i]<0) 17 { 18 c[i+1]-=1; 19 c[i]+=10; 20 } 21 } 22 while(c[lc]==0&&lc>0) 23 { 24 lc-=1; 25 } 26 if(lc==0) 27 { 28 lc=1; 29 } 30 return; 31 } 32 void high_precision_redundancy() 33 { 34 la=s1.length(); 35 lb=s2.length(); 36 lc=la; 37 for(int i=0;i<la;i++) 38 { 39 a[la-i]=s1[i]-‘0‘; 40 } 41 for(int i=0;i<lb;i++) 42 { 43 b[lb-i]=s2[i]-‘0‘; 44 } 45 if(s1.length()<s2.length()) 46 { 47 for(int i=1;i<=la;i++) 48 { 49 c[i]=a[i]; 50 } 51 return; 52 } 53 if(s1.length()==s2.length()&&s1<s2) 54 { 55 for(int i=1;i<=la;i++) 56 { 57 c[i]=a[i]; 58 } 59 return; 60 } 61 while(true) 62 { 63 subtraction(); 64 for(int i=1;i<=lc;i++) 65 { 66 a[i]=c[i]; 67 c[i]=0; 68 } 69 la=lc; 70 if(la<lb) 71 { 72 break; 73 } 74 if(la==lb) 75 { 76 int tmpa=la,tmpb=lb; 77 bool flag=false; 78 while(tmpa>=1&&tmpb>=1) 79 { 80 if(a[tmpa]<b[tmpb]) 81 { 82 flag=true; 83 break; 84 } 85 tmpa-=1; 86 tmpb-=1; 87 } 88 if(flag) 89 { 90 break; 91 } 92 } 93 } 94 return; 95 }
以上是关于高精度运算的主要内容,如果未能解决你的问题,请参考以下文章