【原创】高精度(压位储存)模板
无聊写了个高精度模板玩玩......
(以前有些地方写错了TAT)
1 /* 2 唐代李白 3 《江夏别宋之悌》 4 楚水清若空,遥将碧海通。人分千里外,兴在一杯中。 5 谷鸟吟晴日,江猿啸晚风。平生不下泪,于此泣无穷. 6 */ 7 #include <iostream> 8 #include <cstdio> 9 #include <algorithm> 10 #include <cstring> 11 #include <vector> 12 #include <utility> 13 #include <iomanip> 14 #include <string> 15 #include <cmath> 16 #include <queue> 17 #include <assert.h> 18 #include <map> 19 #include <ctime> 20 #include <cstdlib> 21 #include <stack> 22 #include <set> 23 #define LOCAL 24 const int INF = 0x7fffffff; 25 const int MAXN = 100000 + 10; 26 const int maxnode = 20000 * 2 + 200000 * 20; 27 const int MAXM = 50000 + 10; 28 const int MAX = 100; 29 using namespace std; 30 struct hp{ 31 int num[MAX]; 32 ////hp(){num[0] = 0;} 33 hp & operator = (const char *str); 34 hp & operator = (int b); 35 36 //最好先比较一下再大的减小的 37 hp operator + (const hp &)const; 38 hp operator * (const hp &)const; 39 hp operator - (const hp &)const; 40 hp operator / (const hp &)const; 41 42 bool operator < (const hp &)const; 43 bool operator > (const hp &)const; 44 bool operator == (const hp &)const; 45 bool operator >= (const hp &)const; 46 bool operator <= (const hp &)const; 47 }; 48 bool hp::operator < (const hp &b)const{ 49 if (num[0] < b.num[0]) return 1; 50 for (int i = num[0]; i >= 1; i--){ 51 if (num[i] < b.num[i]) return 1; 52 else if (num[i] > b.num[i]) return 0; 53 } 54 return 0; 55 } 56 bool hp::operator > (const hp &b)const{return b < (*this);} 57 bool hp::operator == (const hp &b)const {return ((!(b < (*this))) && (!(b > (*this))));} 58 bool hp::operator <= (const hp &b)const {return !((*this) > b);} 59 bool hp::operator >= (const hp &b)const {return !((*this) < b);} 60 //注意d为余数 61 hp hp::operator / (const hp &b)const{ 62 hp d, c; 63 memset(c.num, 0, sizeof(c)); 64 memset(d.num, 0, sizeof(d)); 65 c.num[0] = num[0] + b.num[0] + 1;//和乘法的长度是一样的,长除法.. 66 d.num[0] = 0; 67 68 for (int i = num[0]; i >= 1; i--){ 69 //这个是腾出一个d.num[1]的空间 70 memmove(d.num + 2, d.num + 1, sizeof(d.num) - sizeof(int) * 2); 71 d.num[0]++; 72 d.num[1] = num[i]; 73 74 int l = 0, r = 9999, mid;//枚举除数 75 while (l < r){//不同的写法当然可以 76 int mid = (l + r) >> 1; 77 hp tmp; 78 tmp = mid;tmp = tmp * b; 79 //b乘以乘数当然不能大于余数 80 if (tmp <= d) l = mid + 1; 81 else r = mid; 82 } 83 c.num[i] = r - 1; 84 hp tmp; tmp = r - 1;//r - 1为得到答案 85 tmp = tmp * b; 86 d = d - tmp; 87 } 88 while (c.num[c.num[0]] == 0 && c.num[0] > 1) c.num[0]--; 89 return c; 90 } 91 hp & hp::operator = (const int b){ 92 char str[MAX]; 93 sprintf(str, "%d", b); 94 return *this = str; 95 } 96 hp & hp::operator = (const char *str){ 97 int len = strlen(str), k = 1; 98 memset(num, 0, sizeof(num)); 99 num[0] = 1; 100 for (int i = len - 1 ; i >= 0; i--){ 101 if (k == 10000) {k = 1; num[0]++;} 102 num[num[0]] += k * (str[i] - '0'); 103 k *= 10; 104 } 105 return *this; 106 } 107 hp hp::operator + (const hp &b)const{ 108 hp c; 109 memset(c.num, 0, sizeof(c.num)); 110 c.num[0] = max(num[0], b.num[0]); 111 for (int i = 1; i <= c.num[0]; i++){ 112 c.num[i] += num[i] + b.num[i]; 113 c.num[i + 1] += c.num[i] / 10000; 114 c.num[i] %= 10000; 115 } 116 if (c.num[c.num[0] + 1] > 0) c.num[0]++; 117 return c; 118 } 119 hp hp::operator * (const hp &b)const{ 120 hp c; 121 memset(c.num, 0, sizeof(c.num)); 122 c.num[0] = num[0] + b.num[0] + 1; 123 for (int i = 1; i <= num[0]; i++) 124 for (int j = 1; j <= b.num[0]; j++){ 125 c.num[i + j - 1] += num[i] * b.num[j]; 126 c.num[i + j] += c.num[i + j - 1] / 10000; 127 c.num[i + j - 1] %= 10000; 128 } 129 while (c.num[c.num[0]] == 0 && c.num[0] > 1) c.num[0]--; 130 return c; 131 } 132 hp hp::operator - (const hp &b)const{ 133 hp c; 134 memset(c.num, 0, sizeof(c.num)); 135 c.num[0] = max(num[0], b.num[0]); 136 for (int i = 1; i <= c.num[0]; i++){ 137 c.num[i] += num[i] - b.num[i]; 138 if (c.num[i] < 0){ 139 c.num[i + 1]--; 140 c.num[i] += 10000; 141 } 142 } 143 while (c.num[c.num[0]] == 0 && c.num[0] > 1) c.num[0]--; 144 return c; 145 } 146 void print(hp c){ 147 printf("%d", c.num[c.num[0]]); 148 for (int i = c.num[0] - 1; i >= 1; i--) printf("%04d", c.num[i]); 149 return; 150 } 151 152 int main(){ 153 #ifdef LOCAL 154 freopen("data.txt", "r", stdin); 155 freopen("out.txt", "w", stdout); 156 #endif 157 hp c; 158 c = 0; 159 hp a; 160 a = 20300; 161 hp b; 162 //print(a); 163 //print(c); 164 b = c / a; 165 print(b); 166 //printf("%d", (a == c)); 167 return 0; 168 }