高精度加法
把数转换为数组,模拟竖式相加过程,把每一位相加,如果这一位大于等于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