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 }
  • 相关阅读:
    unity panel删除drawcall失败导致的残留影像
    c# List的排序
    动画播放一段就禁用
    delegate用法
    ctrl+alt+end 修改桌面密码
    Windows 下curl htpps
    Linux下端口映射工具rinetd
    Linux系统下强制踢掉登录用户
    linux ls 按文件大小排序
    chrome的功能Copy as cURL
  • 原文地址:https://www.cnblogs.com/liuyongliu/p/10295707.html
Copyright © 2011-2022 走看看