20191114 | 高精度
高精度板子:
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 using namespace std; 5 struct node 6 { 7 static const int M = 10000; 8 int num[M+10],len; 9 node(){clean();} 10 void clean() 11 { 12 memset(num,0,sizeof(num)); 13 len = 1; 14 } 15 void read() 16 { 17 char s[M+10]; 18 scanf("%s",s); 19 len = strlen(s); 20 for(int i = 1;i <= len;i ++)num[i] = s[len - i] - '0'; 21 } 22 void write() 23 { 24 for(int i = len;i >= 1;i --)printf("%d",num[i]); 25 } 26 friend bool operator < (node a,node b) 27 { 28 if(a.len != b.len)return a.len < b.len; 29 for(int i = a.len;i >= 1;i --)if(a.num[i] != b.num[i])return a.num[i] < b.num[i]; 30 return 0; 31 } 32 friend bool operator > (node a,node b) 33 { 34 return b < a; 35 } 36 friend bool operator <= (node a,node b) 37 { 38 return !(b > a); 39 } 40 friend bool operator >= (node a,node b) 41 { 42 return !(a < b); 43 } 44 friend bool operator != (node a,node b) 45 { 46 return a < b || b < a; 47 } 48 friend bool operator == (node a,node b) 49 { 50 return !(a < b || b < a); 51 } 52 friend node operator + (node a,node b) 53 { 54 node s; 55 s.len = max(a.len,b.len); 56 for(int i = 1;i <= s.len;i ++) 57 { 58 s.num[i] += a.num[i] + b.num[i]; 59 s.num[i+1] = s.num[i] / 10; 60 s.num[i] %= 10; 61 } 62 while(s.num[s.len + 1])s.len ++; 63 return s; 64 } 65 friend node operator - (node a,node b) 66 { 67 node s; 68 s.len = max(a.len,b.len); 69 for(int i = 1;i <= s.len;i ++) 70 { 71 s.num[i] += a.num[i] - b.num[i]; 72 if(s.num[i]<0) 73 { 74 s.num[i] += 10; 75 s.num[i+1]--; 76 } 77 } 78 while(!s.num[s.len]&&s.len > 1)s.len --; 79 return s; 80 } 81 friend node operator * (node a,node b) 82 { 83 node s; 84 if((b.len == 1 && b.num[1] == 0) || (a.len == 1 && a.num[1] == 0))return s; 85 s.len = a.len + b.len - 1; 86 for(int i = 1;i <= a.len; i++) 87 { 88 for(int j = 1;j <= b.len;j ++) 89 { 90 s.num[i+j-1] += a.num[i] * b.num[j]; 91 s.num[i+j] += s.num[i+j-1]/10; 92 s.num[i+j-1] %= 10; 93 } 94 95 96 } 97 while(s.num[s.len+1])s.len ++; 98 return s; 99 } 100 void tonode(int x) 101 { 102 clean(); 103 while(x) 104 { 105 num[len++] = x % 10; 106 x /= 10; 107 } 108 if(len != 1)len --; 109 } 110 friend node operator / (node a,node b) 111 { 112 node s; 113 if((b.len == 1 && b.num[1] == 0) || (a.len == 1 && a.num[1] == 0))return s; 114 node r,n; 115 s.len = 0; 116 for(int i = a.len;i >= 1;i --) 117 { 118 n.tonode(10); 119 r = r * n; 120 n.tonode(a.num[i]); 121 r = r + n; 122 int f = 0; 123 for(int j = 1;j <= 10;j ++) 124 { 125 n.tonode(j); 126 if(n * b > r) 127 { 128 f = j - 1; 129 break; 130 } 131 } 132 s.num[++s.len] = f; 133 n.tonode(f); 134 r = r - n * b; 135 } 136 for(int i = 1;i <= s.len / 2;i ++) 137 { 138 swap(s.num[i],s.num[s.len-i+1]); 139 } 140 while(!s.num[s.len] && s.len > 1)s.len --; 141 if(!s.len) 142 { 143 s.len = 1; 144 s.num[1] = 0; 145 } 146 return s; 147 } 148 friend node operator % (node a,node b) 149 { 150 node s; 151 node p = a / b; 152 s = a - p * b; 153 return s; 154 } 155 }; 156 int main() 157 { 158 node a,b; 159 a.read(); 160 b.read(); 161 node c; 162 c = a + b; 163 c.write(); 164 putchar('\n'); 165 c = a - b; 166 c.write(); 167 putchar('\n'); 168 c = a * b; 169 c.write(); 170 putchar('\n'); 171 c = a / b; 172 c.write(); 173 putchar('\n'); 174 c = a % b; 175 c.write(); 176 putchar('\n'); 177 return 0; 178 }