Sgu 112
|
112. ab-ba time limit per test: 0.25 sec. memory limit per test: 4096 KB
You are given natural numbers a and b. Find ab-ba.
Input Input contains numbers a and b (1≤a,b≤100).
Output Write answer to output.
Sample Input 2 3 Sample Output -1 |
1 #include <iostream> 2 #include <cstdio> 3 #include <string> 4 #include <sstream> 5 #include <memory> 6 #include <algorithm> 7 8 #define BASE 1000 // 基数 9 #define DIG 1100 // 存储 10 using namespace std; 11 12 class BigNumber 13 { 14 private: 15 int data[DIG]; // 数据区 16 int len; // 记录长度 17 public: 18 BigNumber() { len = 1; memset(data, 0, sizeof(data)); data[0] = 1; } 19 BigNumber(int); // 输入默认十进制 20 BigNumber(char*); 21 BigNumber(const BigNumber &); 22 // 类型转换 23 BigNumber & Num_BNum(int); //把一个整数转换成BigNumber型的 24 BigNumber & Str_BNum(char*); //把一个字符串类型的转换成BigNumber型的 25 int Int(); 26 string Str(); 27 // HPC 28 BigNumber & Add(const BigNumber &); 29 BigNumber & Sub(const BigNumber &); 30 BigNumber & Mul(const BigNumber &); 31 BigNumber & Div(int); 32 BigNumber & Mod(int); 33 BigNumber & operator=(const BigNumber &); 34 int Bigger(const BigNumber &) const; 35 36 BigNumber operator + (const BigNumber &); 37 BigNumber operator - (const BigNumber &); 38 BigNumber operator * (const BigNumber &); 39 BigNumber operator / (int); 40 BigNumber operator % (int); 41 42 BigNumber & operator += (const BigNumber &); 43 BigNumber & operator -= (const BigNumber &); 44 BigNumber & operator *= (const BigNumber &); 45 BigNumber & operator /= (int); 46 BigNumber & operator %= (int); 47 }; 48 49 BigNumber & BigNumber::Num_BNum(int b) 50 { 51 len = 1; memset(data, 0, sizeof(data)); 52 data[0] = 1; 53 if (b < 0) { 54 b = -b; 55 data[0] = -1; 56 } 57 while (b > 0) { 58 data[len++] = b % BASE; 59 b /= BASE; 60 } 61 return *this; 62 } 63 64 BigNumber & BigNumber::Str_BNum(char* sb) 65 { 66 int t = 0, d = 1, b = 0, slen = strlen(sb), i; 67 len = 1; memset(data, 0, sizeof(data)); 68 data[0] = 1; 69 if (sb[0] == '-') data[0] = -1, b = 1; 70 for (i = slen - 1; i >= b; i--) { 71 while (t >= BASE || d > BASE) { 72 data[len++] = t % BASE; 73 t /= BASE; 74 d = 10; 75 } 76 t += (sb[i] - '0') * d; 77 d *= 10; 78 } 79 while (t > 0) { 80 data[len++] = t % BASE; 81 t /= BASE; 82 } 83 return *this; 84 } 85 86 int BigNumber::Int() 87 { 88 istringstream sin; 89 int v; 90 sin.str(this->Str()); 91 sin >> v; 92 return v; 93 } //这个函数的用法还是第一次看到,没看懂 94 95 string BigNumber::Str() 96 { 97 int i, base_len = 0; 98 ostringstream sout; 99 if (len == 1) { 100 sout << '0'; 101 //sout << endl; 102 return sout.str(); 103 } 104 if (data[0] < 0) sout << "-"; 105 sout << data[len - 1]; 106 i = BASE; 107 while (i > 1) { 108 base_len++; 109 i /= 10; 110 } 111 for (i = len - 2; i>0; i--) { 112 sout.width(base_len); 113 sout.fill('0'); 114 sout << data[i]; 115 } 116 //sout << endl; 117 return sout.str(); 118 } //这个函数也没有看懂 119 120 BigNumber::BigNumber(int b) 121 { 122 this->Num_BNum(b); 123 } 124 125 BigNumber::BigNumber(char* sb) 126 { 127 this->Str_BNum(sb); 128 } 129 // -1 a<b, 0 a==b, 1 a>b 130 BigNumber::BigNumber(const BigNumber & b) 131 { 132 len = b.len; memcpy(data, b.data, sizeof(data)); 133 } 134 135 int BigNumber::Bigger(const BigNumber & b) const 136 { 137 int i, flag; 138 if (data[0] == 1 && b.data[0] == 1) flag = 1; 139 else if (data[0] == 1 && b.data[0] == -1) return 1; 140 else if (data[0] == -1 && b.data[0] == 1) return -1; 141 else flag = -1; 142 143 if (len > b.len) return flag; 144 else if (len == b.len) { 145 for (i = len - 1; i>0; i--) 146 if (data[i] > b.data[i]) return flag; 147 } 148 if (i == 0) return 0; 149 return -flag; 150 } //比较函数 151 152 BigNumber & BigNumber::Add(const BigNumber & b) 153 { 154 int i; 155 if (data[0] * b.data[0] != 1) { 156 data[0] = -data[0]; 157 Sub(b); 158 data[0] = -data[0]; 159 return *this; 160 } 161 len = len > b.len ? len : b.len; 162 for (i = 1; i<len; i++) { 163 data[i] += b.data[i]; 164 if (data[i] >= BASE) { 165 data[i + 1]++; 166 data[i] -= BASE; 167 } 168 } 169 if (data[i] > 0) len = i + 1; 170 return *this; 171 } //加上b这个大数 172 173 BigNumber & BigNumber::Sub(const BigNumber & b) 174 { 175 int i; 176 if (data[0] * b.data[0] != 1) { 177 data[0] = -data[0]; 178 Add(b); 179 data[0] = -data[0]; 180 return *this; 181 } 182 len = len > b.len ? len : b.len; 183 for (i = 1; i<len; i++) { 184 data[i] -= b.data[i]; 185 if (data[i] < 0) { 186 data[i + 1]--; 187 data[i] += BASE; 188 } 189 } 190 if (data[len] < 0) { 191 for (i = 0; i <= len; i++) 192 data[i] = -data[i]; 193 for (i = 1; i<len; i++) 194 if (data[i] < 0) { 195 data[i + 1]--; 196 data[i] += BASE; 197 } 198 } 199 while (data[len - 1] == 0) len--; 200 return *this; 201 } 202 203 BigNumber & BigNumber::Mul(const BigNumber & b) 204 { 205 BigNumber bt; 206 int i, j, up; 207 int temp, temp1; 208 209 bt.data[0] = data[0] * b.data[0]; 210 for (i = 1; i<len; i++) { 211 up = 0; 212 for (j = 1; j<b.len; j++) { 213 temp = data[i] * b.data[j] + bt.data[i + j - 1] + up; 214 if (temp >= BASE) { 215 temp1 = temp % BASE; 216 up = temp / BASE; 217 bt.data[i + j - 1] = temp1; 218 } 219 else { 220 up = 0; 221 bt.data[i + j - 1] = temp; 222 } 223 } 224 if (up != 0) bt.data[i + j - 1] = up; 225 } 226 bt.len = i + j; 227 while (bt.data[bt.len - 1] == 0) bt.len--; 228 *this = bt; 229 return *this; 230 } 231 232 BigNumber & BigNumber::Div(int b) 233 { 234 BigNumber bt; 235 int i, down = 0; 236 237 if (b < 0) bt.data[0] = -data[0], b = -b; 238 else bt.data[0] = data[0]; 239 for (i = len - 1; i >= 1; i--) { 240 bt.data[i] = (data[i] + down * BASE) / b; 241 down = data[i] + down * BASE - bt.data[i] * b; 242 } 243 bt.len = len; 244 while (bt.data[bt.len - 1] == 0) bt.len--; 245 *this = bt; 246 return *this; 247 } 248 249 BigNumber & BigNumber::Mod(int b) 250 { 251 int temp = 0, up = 0, i; 252 for (i = len - 1; i >= 1; i--) { 253 temp = data[i]; 254 temp += up * BASE; 255 up = temp % b; 256 } 257 if (data[0] < 0) up = -up; 258 *this = up; 259 return *this; 260 } 261 262 BigNumber & BigNumber::operator = (const BigNumber & b) 263 { 264 len = b.len; memcpy(data, b.data, sizeof(data)); return *this; 265 } 266 267 BigNumber BigNumber::operator + (const BigNumber & b) 268 { 269 BigNumber bt = *this; return bt.Add(b); 270 } 271 272 BigNumber BigNumber::operator - (const BigNumber & b) 273 { 274 BigNumber bt = *this; return bt.Sub(b); 275 } 276 277 BigNumber BigNumber::operator * (const BigNumber & b) 278 { 279 BigNumber bt = *this; return bt.Mul(b); 280 } 281 282 BigNumber BigNumber::operator / (int b) 283 { 284 BigNumber bt = *this; return bt.Div(b); 285 } 286 287 BigNumber BigNumber::operator % (int b) 288 { 289 BigNumber bt = *this; return bt.Mod(b); 290 } 291 292 BigNumber & BigNumber::operator += (const BigNumber & b) 293 { 294 return this->Add(b); 295 } 296 297 BigNumber & BigNumber::operator -= (const BigNumber & b) 298 { 299 return this->Sub(b); 300 } 301 302 BigNumber & BigNumber::operator *= (const BigNumber & b) 303 { 304 return this->Mul(b); 305 } 306 307 BigNumber & BigNumber::operator /= (int b) 308 { 309 return this->Div(b); 310 } 311 312 BigNumber & BigNumber::operator %= (int b) 313 { 314 return this->Mod(b); 315 } 316 BigNumber z, x_1, x_2; 317 string s; 318 int main(){ 319 int x, y; 320 cin >> x >> y; 321 x_1 = 1; x_2 = 1; 322 for (int i = 0; i < y; i++)x_1 = x_1*x; 323 for (int i = 0; i < x; i++)x_2 = x_2*y; 324 z = x_1 - x_2; s=z.Str(); 325 cout << s; cout << endl; 326 }
浙公网安备 33010602011771号