高精度四则运算

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <algorithm>
  4 #include <cstring>
  5 #include <string>
  6 #include <vector>
  7 #include <map>
  8 #include <set>
  9 #include <queue>
 10 #include <list>
 11 #include <cstdlib>
 12 #include <iterator>
 13 #include <cmath>
 14 #include <iomanip>
 15 #include <bitset>
 16 #include <cctype>
 17 
 18 using namespace std;
 19 #define cin_1(a) scanf("%d",&a)
 20 #define cin_2(a,b) scanf("%d%d",&a,&b)
 21 #define cin_3(a,b,c) scanf("%d%d%d",&a,&b,&c)
 22 #define max_2(a,b) a>b?a:b
 23 #define max_3(a,b,c) max_2(max_2(a,b),c)
 24 #define ll long long
 25 #define rint register int
 26 #define mem0(x) memset(x, 0, sizeof(x))
 27 #define mem1(x) memset(x, -1, sizeof(x))
 28 inline int read()///神奇的读优
 29 {
 30     int x=0,f=1;char c=getchar();
 31     while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
 32     while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
 33     return x*f;
 34 }
 35 const int inf = 0x3f3f3f3f;
 36 const ll inff = 0x3f3f3f3f3f3f3f3f;
 37 //map<ll,ll>mp;
 38 //set<ll>st;
 39 /***********************************************/
 40 bool judge(string str1,string str2)///是否str1小于str2
 41 {
 42     int len1=str1.length();
 43     int len2=str2.length();
 44     if(len1<len2 || (len1==len2 && str1<str2)) return 1;
 45     return 0;
 46 }
 47 
 48 string add(string str1,string str2)///高精度加法
 49 {
 50     string str;
 51     vector<int>x,y;
 52     int len1=str1.length();
 53     int len2=str2.length();
 54     int len=max(len1,len2);
 55     for(int i=len1-1;i>=0;i--) x.push_back(str1[i]-'0');
 56     for(int i=len2-1;i>=0;i--) y.push_back(str2[i]-'0');
 57     for(int i=0;i<len;i++)
 58     {
 59         if(i<len1 && i<len2) x[i]+=y[i];
 60         else if(i>=len1 && i<len2) x.push_back(y[i]);
 61     }
 62     for(int i=0;i<len-1;i++)///进位
 63         if(x[i]>=10) { x[i+1]+=x[i]/10; x[i]%=10; }
 64     if(x[len-1]>=10){
 65         x.push_back(x[len-1]/10);
 66         x[len-1]%=10;
 67         len++;
 68     }
 69     for(int i=len-1;i>=0;i--) str+=x[i]+'0';
 70     return str;
 71 }
 72 
 73 string sub(string str1,string str2)///高精度减法
 74 {
 75     int f=0;
 76     string str;
 77     vector<int>x,y;
 78     int len1=str1.length();
 79     int len2=str2.length();
 80     if(len1<len2 || (len1==len2 && str1<str2)){swap(str1,str2);swap(len1,len2);f=1;}
 81     for(int i=len1-1;i>=0;i--) x.push_back(str1[i]-'0');
 82     for(int i=len2-1;i>=0;i--) y.push_back(str2[i]-'0');
 83     for(int i=0;i<len2;i++) x[i]-=y[i];
 84     for(int i=0;i<len1-1;i++) if(x[i]<0){x[i+1]--;x[i]+=10;}///进位
 85     while(x[len1-1]==0 && len1>1) len1--;///去前导0
 86     if(f) str+='-';
 87     for(int i=len1-1;i>=0;i--) str+='0'+x[i];
 88     return str;
 89 }
 90 
 91 string mul(string str1,string str2)///高精度乘法
 92 {
 93     string str;
 94     str+='0';
 95     vector<int>x,y;
 96     int len1=str1.length();
 97     int len2=str2.length();
 98     for(int i=len1-1;i>=0;i--) x.push_back(str1[i]-'0');
 99     for(int i=len2-1;i>=0;i--) y.push_back(str2[i]-'0');
100     for(int i=0;i<len1;i++)
101     {
102         int yy=len2;
103         vector<int>z;
104         for(int j=0;j<len2;j++) z.push_back(x[i]*y[j]);
105         for(int j=0;j<len2-1;j++) if(z[j]>=10) {z[j+1]+=z[j]/10; z[j]%=10; }///进位
106         while(z[len2-1]>=10) { z.push_back(z[len2-1]/10);z[len2-1]%=10;len2++; }
107         for(int k=1;k<=i;k++) z.push_back(0);
108         for(int k=len2-1;k>=0;k--) swap(z[k],z[k+i]);
109         len2+=i;
110         while(z[len2-1]==0 && len2>1) len2--;///去前导0
111         string t;
112         for(int ii=len2-1;ii>=0;ii--) t+='0'+z[ii];
113         str=add(str,t);
114         len2=yy;
115     }
116     return str;
117 }
118 
119 string div(string str1,string str2) ///高精度除法 str1/str2
120 {
121     string str,t;
122     int len1=str1.length();
123     int len2=str2.length();
124     for(int i=0;i<len1;i++)
125     {
126         t+=str1[i];
127         string g;
128         for(int k=1;k<=10;k++)///试商
129         {
130             g='0'+k;
131             if(judge(t,mul(g,str2))) ///试商成功
132             {
133                 if(str.length()==0 && k==1) ;
134                 else str+='0'+k-1;///商为 k-1
135                 g='0'+k-1;
136                 t=sub(t,mul(g,str2));
137                 if(t[0]=='0') t="";
138                 break;
139             }
140         }
141     }
142     if(str.length()==0) str+='0';
143     return str;
144 }
145 
146 int main() {
147 
148     return 0;
149 }
原文地址:https://www.cnblogs.com/liuyongliu/p/10295707.html