文章

[原創題]A+B Problem - 提示、題解

GuguGagaOJ #2 A+B Problem

[原創題]A+B Problem - 提示、題解

題目簡介

輸入兩行正整數,輸出其相加結果

提示

推薦打開之後想想看再繼續,不要一次使用全部

提示1

部分正確?看看測資限制可能會得到線索

提示2

如果一個整數裝不下的話,也許可以考慮不限制大小的資料型態?

提示3

用陣列好像沒有長度限制,但字串可能是更有效的資料型態!

提示4

做起來很複雜?反過來會不會比較好做?

提示5

你問怎麼反過來?C++的話試試看reverse()

題解

點開會有完整解答,請想過後再開喔

思路

在題述中,你會發現封鎖Python跟Java了,因為Python跟Java有內建的方式可以快速的解決這題。

題目中藏有小細節,往下滑你可以看到:$0 <= a_i, b_i <= 10^{300}$,直接使用int儲存肯定會超出空間,所以這題得另闢蹊徑。如果你有看提示的話應該有個構想,這邊讓我理出完整流程

  1. 輸入n,並且讓程式循環n
  2. 每次輸入a, b兩個字串
  3. 然後開一個空的字串用來放答案
  4. reverse(s.begin(), s.end())可以把字串s反過來
  5. 由前往後處理,加起來之後的結果放到答案裡面

想一下,如果兩個字串長度不同怎麼辦?

  1. 記得計算進位!可以用bool儲存是否需要進位。
  2. 如果你用ans += sum儲存的話,記得你的數字是反的,要改回來
  3. 輸出!

在下面完整程式碼的部分(要點開隱藏區塊)有一個視覺化程式的程式,如果不介意看到解答的話,透過視覺化可能可以幫助你思考。

這是標準的大數運算題目,遇到數字很大的時候可以把這東西記起來,很好用。

完整程式碼

請注意,本程式碼僅供寫法上參考,直接複製貼上程式碼會導致你學不到任何東西

C++ 範例程式碼

這裡有簡化版的視覺化程式,可以自己調整a, b的數值來看處理數字時的過程。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <bits/stdc++.h>
using namespace std;
#define raymondwengcode ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)

int main() {
raymondwengcode;

    int n; cin >> n;
    for (int k = 0; k < n; k++) {
        string a, b;
        cin >> a >> b;
        reverse(a.begin(), a.end());
        reverse(b.begin(), b.end());
        bool carry = false;
        string ans = "";
        for (int i = 0; carry || i < a.size() || i < b.size(); i++) {
            int sum = carry ? 1 : 0;
            if (i < a.size()) sum += a[i] - '0';
            if (i < b.size()) sum += b[i] - '0';
            ans += (sum % 10) + '0';
            carry = sum >= 10;
        }
        reverse(ans.begin(), ans.end());
        cout << ans << "\n";
    }

    return 0;
}
本文章以 CC BY 4.0 授權

© Raymond Weng. 保留部份權利。

全站總字數: 21282 字

載入中...

本網站使用 Jekyll 產生,採用 Chirpy 主題