• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
HaibaraAi
博客园    首页    新随笔    联系   管理    订阅  订阅

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 }
View Code
posted @ 2014-01-29 19:30  HaibaraAi  阅读(134)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3