高精度(加减乘)

空扰寡人 提交于 2019-12-10 20:19:24

高精度加法

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

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!