高精度加法
把数转换为数组,模拟竖式相加过程,把每一位相加,如果这一位大于等于10,需要进位即下一位加1.
还需要注意的是,每次我们都要把数字颠倒,否则不满足竖式加法的规则。
最后输出的时候,判断是否有前导0
代码1:模拟竖式相加
1 for (int i = lenx;i >= 1;i--) 2 { 3 ans[i]=sa[i]+sb[i]; 4 } 5 for (int i = 1;i <=lenx;i++) 6 { 7 if (ans[i]>=10){ 8 ans[i+1]+=ans[i]/10; 9 ans[i]%=10; 10 } 11 }
代码2: 判断前导0
1 while (ans[lenx]==0&&lenx>1) lenx--; 2 for (int i = lenx;i>=1;i--) 3 { 4 printf ("%d",ans[i]); 5 }
完整代码:
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; char s1[10000],s2[10000]; int sa[10000],sb[10000]; int len1,len2,lenn,lenm; int ans[1000]; int main() { scanf ("%s\n%s",s1+1,s2+1); len1=strlen(s1+1); len2=strlen(s2+1); for (int i = 1,j=len1;i<=len1;i++,j--) { sa[j]=s1[i]-'0'; } for (int i = 1,j=len2;i<=len2;i++,j--) { sb[j]=s2[i]-'0'; } lenn=len1; lenm=len2; int lenx=max(lenn,lenm)+1; for (int i = lenx;i >= 1;i--) { ans[i]=sa[i]+sb[i]; } for (int i = 1;i <=lenx;i++) { if (ans[i]>=10){ ans[i+1]+=ans[i]/10; ans[i]%=10; } } while (ans[lenx]==0&&lenx>1) lenx--; for (int i = lenx;i>=1;i--) { printf ("%d",ans[i]); } return 0; }
高精度减法
只是在进位部分有一点差别,如果减完后的这一位<0,下一位要减1,本身+10
代码如下:
1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <cstring> 5 #include <algorithm> 6 using namespace std; 7 char num1[50005],num2[50005]; 8 int numa1[50005],numa2[50005],ans[50005]; 9 int len1,len2,lenn,lenm; 10 int main( ){ 11 scanf("%s%s",num1+1,num2+1); 12 memset(ans,0,sizeof(ans)); 13 len1=strlen(num1+1); 14 len2=strlen(num2+1); 15 lenm=max(len1,len2); 16 bool big=0;//big=1 :1比2大 big=0 :2比1大 17 if(len1!=len2) big=(len1>len2); 18 else{ 19 for(int i=1;i<=len1;i++){ 20 if(num1[i]>num2[i]){ 21 big=1; 22 break; 23 } 24 if(num1[i]<num2[i]){ 25 big=0; 26 break; 27 } 28 } 29 } 30 if(big==0){ 31 swap(len1,len2); 32 swap(num1,num2); 33 } 34 for(int i=1,j=len1;i<=len1;i++,j--) numa1[i]=num1[j]-'0'; 35 for(int i=1,j=len2;i<=len2;i++,j--) numa2[i]=num2[j]-'0'; 36 for(int i=1;i<=lenm;i++){ 37 ans[i]=numa1[i]-numa2[i]; 38 } 39 for(int i=1;i<=lenm;i++){ 40 if(ans[i]<0){ 41 ans[i]+=10; 42 ans[i+1]--; 43 } 44 else continue; 45 } 46 lenn=lenm; 47 while(ans[lenn]==0&&lenn>=0){ 48 lenn--; 49 if(lenn==-1) { 50 printf("0"); 51 return 0; 52 } 53 } 54 if(big==0) printf("-"); 55 for(int i=lenn;i>=1;i--){ 56 printf("%d",ans[i]); 57 } 58 return 0; 59 }
高精度乘法
1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <algorithm> 5 using namespace std; 6 char num1[2005],num2[2005]; 7 int numa1[2005],numa2[2005],ans[4005]; 8 int len1,len2,lenn,lenm; 9 int lenn1,lenn2; 10 int main( ){ 11 scanf("%s%s",num1+1,num2+1); 12 len1=strlen(num1+1); 13 len2=strlen(num2+1); 14 lenn1=len1; 15 lenn2=len2; 16 memset(numa1,0,sizeof(numa1)); 17 memset(numa2,0,sizeof(numa2)); 18 memset(ans,0,sizeof(ans)); 19 for(int i=1,j=len1;i<=len1;i++,j--) numa1[i]=num1[j]-'0'; 20 for(int i=1,j=len2;i<=len2;i++,j--) numa2[i]=num2[j]-'0'; 21 //for(int i=lenn1;i>=1;i--){ 22 // while(numa1[i]==0) len1--; 23 //} 24 //for(int i=lenn2;i>=1;i--){ 25 // while(numa2[i]==0) len2--; 26 //} 27 //前导0考虑 //判断0的情况 28 for(int i=1;i<=len1;i++){ 29 for(int j=1;j<=len2;j++){ 30 ans[i+j-1]+=numa1[i]*numa2[j]; 31 if(ans[i+j-1]>=10){ 32 ans[i+j]+=ans[i+j-1]/10; 33 ans[i+j-1]%=10; 34 } 35 } 36 } 37 lenn=len1+len2; 38 for(int i=1;i<=lenn;i++){ 39 if(ans[i]>=10){ 40 ans[i+1]+=ans[i]/10; 41 ans[i]%=10; 42 } 43 } 44 while(ans[lenn]==0&&lenn>1){ 45 lenn--; 46 } 47 for(int i=lenn;i>=1;i--){ 48 printf("%d",ans[i]); 49 } 50 return 0; 51 }
来源:https://www.cnblogs.com/very-beginning/p/12018852.html