zoukankan      html  css  js  c++  java
  • 高精度模板

      1 //
      2 //  main.cpp
      3 //  1601
      4 //
      5 //  Created by wanghan on 16/10/12.
      6 //  Copyright © 2016年 wanghan. All rights reserved.
      7 //
      8 
      9 #include<cstdio>
     10 #include<cstring>
     11 #include<vector>
     12 #include<iostream>
     13 #include<set>
     14 #include<map>
     15 #include<cassert>
     16 using namespace std;
     17 
     18 using namespace std;
     19 
     20 struct BigInteger {
     21     typedef unsigned long long LL;
     22     
     23     static const int BASE = 100000000;
     24     static const int WIDTH = 8;
     25     vector<int> s;
     26     
     27     BigInteger& clean(){while(!s.back()&&s.size()>1)s.pop_back(); return *this;}
     28     BigInteger(LL num = 0) {*this = num;}
     29     BigInteger(string s) {*this = s;}
     30     BigInteger& operator = (long long num) {
     31         s.clear();
     32         do {
     33             s.push_back(num % BASE);
     34             num /= BASE;
     35         } while (num > 0);
     36         return *this;
     37     }
     38     BigInteger& operator = (const string& str) {
     39         s.clear();
     40         int x, len = (str.length() - 1) / WIDTH + 1;
     41         for (int i = 0; i < len; i++) {
     42             int end = str.length() - i*WIDTH;
     43             int start = max(0, end - WIDTH);
     44             sscanf(str.substr(start,end-start).c_str(), "%d", &x);
     45             s.push_back(x);
     46         }
     47         return (*this).clean();
     48     }
     49     
     50     BigInteger operator + (const BigInteger& b) const {
     51         BigInteger c; c.s.clear();
     52         for (int i = 0, g = 0; ; i++) {
     53             if (g == 0 && i >= s.size() && i >= b.s.size()) break;
     54             int x = g;
     55             if (i < s.size()) x += s[i];
     56             if (i < b.s.size()) x += b.s[i];
     57             c.s.push_back(x % BASE);
     58             g = x / BASE;
     59         }
     60         return c;
     61     }
     62     BigInteger operator - (const BigInteger& b) const {
     63         assert(b <= *this); // 减数不能大于被减数
     64         BigInteger c; c.s.clear();
     65         for (int i = 0, g = 0; ; i++) {
     66             if (g == 0 && i >= s.size() && i >= b.s.size()) break;
     67             int x = s[i] + g;
     68             if (i < b.s.size()) x -= b.s[i];
     69             if (x < 0) {g = -1; x += BASE;} else g = 0;
     70             c.s.push_back(x);
     71         }
     72         return c.clean();
     73     }
     74     BigInteger operator * (const BigInteger& b) const {
     75         int i, j; LL g;
     76         vector<LL> v(s.size()+b.s.size(), 0);
     77         BigInteger c; c.s.clear();
     78         for(i=0;i<s.size();i++) for(j=0;j<b.s.size();j++) v[i+j]+=LL(s[i])*b.s[j];
     79         for (i = 0, g = 0; ; i++) {
     80             if (g ==0 && i >= v.size()) break;
     81             LL x = v[i] + g;
     82             c.s.push_back(x % BASE);
     83             g = x / BASE;
     84         }
     85         return c.clean();
     86     }
     87     BigInteger operator / (const BigInteger& b) const {
     88         assert(b > 0);  // 除数必须大于0
     89         BigInteger c = *this;       // 商:主要是让c.s和(*this).s的vector一样大
     90         BigInteger m;               // 余数:初始化为0
     91         for (int i = s.size()-1; i >= 0; i--) {
     92             m = m*BASE + s[i];
     93             c.s[i] = bsearch(b, m);
     94             m -= b*c.s[i];
     95         }
     96         return c.clean();
     97     }
     98     BigInteger operator % (const BigInteger& b) const { //方法与除法相同
     99         BigInteger c = *this;
    100         BigInteger m;
    101         for (int i = s.size()-1; i >= 0; i--) {
    102             m = m*BASE + s[i];
    103             c.s[i] = bsearch(b, m);
    104             m -= b*c.s[i];
    105         }
    106         return m;
    107     }
    108     // 二分法找出满足bx<=m的最大的x
    109     int bsearch(const BigInteger& b, const BigInteger& m) const{
    110         int L = 0, R = BASE-1, x;
    111         while (1) {
    112             x = (L+R)>>1;
    113             if (b*x<=m) {if (b*(x+1)>m) return x; else L = x;}
    114             else R = x;
    115         }
    116     }
    117     BigInteger& operator += (const BigInteger& b) {*this = *this + b; return *this;}
    118     BigInteger& operator -= (const BigInteger& b) {*this = *this - b; return *this;}
    119     BigInteger& operator *= (const BigInteger& b) {*this = *this * b; return *this;}
    120     BigInteger& operator /= (const BigInteger& b) {*this = *this / b; return *this;}
    121     BigInteger& operator %= (const BigInteger& b) {*this = *this % b; return *this;}
    122     
    123     bool operator < (const BigInteger& b) const {
    124         if (s.size() != b.s.size()) return s.size() < b.s.size();
    125         for (int i = s.size()-1; i >= 0; i--)
    126             if (s[i] != b.s[i]) return s[i] < b.s[i];
    127         return false;
    128     }
    129     bool operator >(const BigInteger& b) const{return b < *this;}
    130     bool operator<=(const BigInteger& b) const{return !(b < *this);}
    131     bool operator>=(const BigInteger& b) const{return !(*this < b);}
    132     bool operator!=(const BigInteger& b) const{return b < *this || *this < b;}
    133     bool operator==(const BigInteger& b) const{return !(b < *this) && !(b > *this);}
    134 };
    135 
    136 ostream& operator << (ostream& out, const BigInteger& x) {
    137     out << x.s.back();
    138     for (int i = x.s.size()-2; i >= 0; i--) {
    139         char buf[20];
    140         sprintf(buf, "%08d", x.s[i]);
    141         for (int j = 0; j < strlen(buf); j++) out << buf[j];
    142     }
    143     return out;
    144 }
    145 
    146 istream& operator >> (istream& in, BigInteger& x) {
    147     string s;
    148     if (!(in >> s)) return in;
    149     x = s;
    150     return in;
    151 }
    152 set<BigInteger> s;
    153 map<BigInteger, int> m;
    154 
    155 int main() {
    156     BigInteger a, b;
    157     while(cin>>a>>b)
    158     {
    159         cout<<a*b<<endl;
    160     }
    161     return 0;
    162 }
    View Code

    一份比较靠谱的高精度模板

  • 相关阅读:
    为民服务贴——提供学习交流的其他比较好的平台
    【转】Web服务软件工厂
    【转】在 SQL Server 2005 中使用表值函数来实现空间数据库
    回家过年(春联)
    ArcGIS Server9.2学习开发(2)——安装配置篇
    烦困人间 游戏生活
    ArcGIS Server9.2学习开发(6)——使用Navigation、ZoomLevel和ScaleBar控件
    【转】激活 ActiveX 控件
    用Eclipse写java
    无题
  • 原文地址:https://www.cnblogs.com/wolf940509/p/5951504.html
Copyright © 2011-2022 走看看