zoukankan      html  css  js  c++  java
  • 高精度四则运算

      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 }
  • 相关阅读:
    java_oop_方法2
    POJ 3276 Face The Right Way(反转)
    POJ 3276 Face The Right Way(反转)
    POJ 2566 Bound Found(尺取法,前缀和)
    POJ 2566 Bound Found(尺取法,前缀和)
    POJ 3320 Jessica's Reading Problem(尺取法)
    POJ 3320 Jessica's Reading Problem(尺取法)
    POJ 3061 Subsequence(尺取法)
    POJ 3061 Subsequence(尺取法)
    HDU 1222 Wolf and Rabbit(欧几里得)
  • 原文地址:https://www.cnblogs.com/liuyongliu/p/10295707.html
Copyright © 2011-2022 走看看