這道題目是大數(shù)加法。總結(jié)一些一點(diǎn)經(jīng)驗(yàn)。
(1)整值函數(shù)的應(yīng)用。(這個(gè)不懂的話,去看我Math欄目下有這個(gè)分析)
(2)sscanf、sprintf的應(yīng)用
(3)分塊計(jì)算的格式問題。
先直接看代碼:
1 #include <iostream>
2 #include <cstdio>
3 #include <vector>
4 #include <cstring>
5 using namespace std;
6 struct BigInteger {
7 static const int BASE = 100000000;
8 static const int WIDTH = 8;
9 vector<int> s;
10
11 BigInteger(long long num = 0) {
12 *this = num;
13 }
14
15 BigInteger operator=(long long num) {
16 s.clear();
17 do {
18 s.push_back(num % BASE);
19 num /= BASE;
20 }while (num > 0);
21 return *this;
22 }
23
24
25 BigInteger operator=(const string& str) {
26 s.clear();
27 int x;
28 int len = (str.size() - 1) / WIDTH + 1;//這里有人看不懂,請看我寫的整值函數(shù)
29 for (int i = 0; i < len; i++) {
30 int end = str.size() - i * WIDTH;
31 int start = max(0, end - WIDTH);//確定分割的區(qū)間為[start, end)是左閉右開,長度就是end - start
32 sscanf(str.substr(start, end - start).c_str(), "%d", &x);
33 s.push_back(x);
34 }
35 return *this;
36 }
37
38 BigInteger operator+(const BigInteger& bi) const{
39 BigInteger temp;
40 temp.s.clear();
41 for (int i = 0,g = 0;;i++) {
42
43 if (g == 0 && i >= s.size() && i >= bi.s.size()) break;
44 int x = g;
45 if (i < s.size()) x += s[i];
46 if (i < bi.s.size()) x += bi.s[i];
47 temp.s.push_back(x % BASE);
48 g = x / BASE;
49 }
50 return temp;
51 }
52
53 BigInteger operator +=(const BigInteger& b) {
54 *this = *this + b;return *this;
55 }
56 };
57
58 istream& operator >>(istream &in, BigInteger& x) {
59 string s;
60 if (!(in >>s)) return in;
61 x = s;
62 return in;
63 }
64
65 ostream& operator <<(ostream &out, BigInteger&bi) {
66 out << bi.s.back();
67 for (int i = bi.s.size()-2; i >= 0; i--) {//再從倒數(shù)第二個(gè)輸出
68 char buf[20];
69 sprintf(buf, "%08d", bi.s[i]);
70 //cout << buf;
71 for (int j =0; j < strlen(buf); j++) out << buf[j];
72 }
73 return out;
74 }
75
76 int main() {
77 int n;
78 BigInteger a,b,c;
79 cin >> n;
80 int kase = 1;
81 while (n) {
82 cin >> a >> b;
83 c = a + b;
84 if (n != 1)
85 cout <<"Case " << kase++ << ":" << "\n" << a << " + " << b << " = " << c << endl << endl;
86 else
87 cout <<"Case " << kase++ << ":" << "\n" << a << " + " << b << " = " << c << endl;
88 n--;
89 }
90 return 0;
91 }
(1)(2)略。
(3)分塊處理的坑:
前面兩個(gè)我就不總結(jié)了,這里主要說下,分塊計(jì)算的坑。假設(shè)有這個(gè)字符串"123400000001",由于我們要將其
按照沒8位字符分成一塊所以第一塊就是00000001、第二快就是1234,然后按照小端存儲(chǔ)格式、低地址對(duì)應(yīng)低位
但是但他們用sscanf格式化成整數(shù)時(shí)候,00000001不可能還是這樣,這樣就是八進(jìn)制了,而是變成了1,所以我們
在輸出的時(shí)候,除了最高位對(duì)應(yīng)的那一塊可能不足8位,剩下的塊肯定都要8位處理,所以上面代碼,才從第二快進(jìn)行
輸出,而且格式是%08d.