【个人模板】高精度算法

一、求两个高精度正数的和差积

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<cmath>
  5 using namespace std;
  6 const int MAXN=1000;
  7 char s1[MAXN],s2[MAXN];
  8 int ed1,ed2,n1,n2;
  9 int num1[MAXN];
 10 int num2[MAXN];
 11 int ans[MAXN];
 12 
 13 void input()
 14 {
 15     scanf("%s%s",s1,s2);
 16     ed1=strlen(s1)-1;
 17     ed2=strlen(s2)-1;
 18 }
 19 
 20 void switchnum()//把字符转换为数字 
 21 {
 22     memset(num1,0,sizeof(num1));
 23     memset(num2,0,sizeof(num2));
 24     for (int i=ed1;i>=0;i--) num1[ed1-i]=s1[i]-'0';
 25     for (int i=ed2;i>=0;i--) num2[ed2-i]=s2[i]-'0';
 26 }
 27 
 28 void add()
 29 {
 30     memset(ans,0,sizeof(ans));
 31     int ed=max(ed1,ed2),carry=0;
 32     for (int k=0;k<=ed;k++)
 33     {
 34         ans[k]=num1[k]+num2[k]+carry;
 35         carry=ans[k]/10;
 36         ans[k]=ans[k]%10;
 37     }
 38     if (carry>0) 
 39     {
 40         ed++;
 41         ans[ed]=carry;
 42     }
 43     for (int k=ed;k>=0;k--) cout<<ans[k];cout<<endl;
 44 } 
 45 
 46 void sub()
 47 {
 48 /*strcmp是字符串比较函数,作用是比较字符串1和字符串2
 49 如:strcmp(str1,str2);
 50   strcmp("china","korea");
 51 比较的结果由函数带回。
 52 (1)如果字符串1=字符串2,函数值为0。
 53 (2)如果字符串1〉字符串2,函数值为一正整数
 54 (3)如果字符串1<字符串2,函数值为一负整数*/ 
 55     memset(ans,0,sizeof(ans));
 56     int ed=max(ed1,ed2),f;
 57     if (ed1==ed2) f=strcmp(s1,s2); //这里不能写成(ed1=ed2),否则会赋值 
 58         else{
 59             if (ed1>ed2) f=1;
 60             else f=-1;
 61         }
 62     for (int k=0;k<=ed;k++)
 63     {
 64         if (f>=0) ans[k]+=num1[k]-num2[k];
 65         else ans[k]+=num2[k]-num1[k];
 66         if (ans[k]<0)
 67         {
 68             ans[k]+=10;
 69             ans[k+1]--;
 70         }
 71     }
 72     if (0==ans[ed]) ed--; //这里不能写成ans[ed]=0,否则会进行赋值 
 73     for (int k=ed;k>=0;k--) cout<<ans[k];cout<<endl;
 74 }
 75 
 76 void mul()
 77 {
 78     memset(ans,0,sizeof(ans));
 79     int ed=ed1+ed2;
 80     for (int i=0;i<=ed1;i++)
 81         for (int j=0;j<=ed2;j++)
 82         {
 83             ans[i+j]+=num1[i]*num2[j];
 84             if (i+j>0)
 85             {
 86                 ans[i+j]+=ans[i+j-1]/10;
 87                 ans[i+j-1]%=10;
 88             } 
 89         }
 90     if (ans[ed]>9)
 91     {
 92         ed++;
 93         ans[ed]=ans[ed-1]/10;
 94         ans[ed-1]%=10; 
 95     }  
 96     for (int k=ed;k>=0;k--) 
 97     {
 98         cout<<ans[k];
 99     }
100     cout<<endl;
101 }
102 
103 int main()
104 {
105     input();
106     switchnum();
107     add();
108     sub();
109     mul();
110     return 0;
111 } 

二、求一个高精度正数和一个低精度正数的商和余数

 1 #include<iostream>
 2 #include<cstring> 
 3 #include<cstdio>
 4 using namespace std;
 5 const int MAXN=1000;
 6 char a[MAXN];
 7 int num[MAXN];
 8 int b,rem;
 9 
10 int main()
11 {
12     scanf("%s%d",a,&b);
13     for (int i=0;i<strlen(a);i++) num[i]=a[i]-'0';
14     rem=0; 
15     bool f=false;
16     for (int i=0;i<strlen(a);i++)
17     {
18         rem=rem*10+num[i];
19         if (rem>b) f=true;
20         if (f) cout<<rem/b;
21         rem%=b;
22     }
23     cout<<endl;
24     if (rem!=0) cout<<rem<<endl;
25     return 0; 
26 }
原文地址:https://www.cnblogs.com/iiyiyi/p/4617136.html