【PTA甲級、C++簡單解答】1001 A+B Format (20分)

MYMarcoreus發表於2020-11-03

關鍵是求得第一個逗號應該出現的索引位置,下面這一個式子很關鍵

int start_of_comma = start_of_num + (len_of_num%3 == 0 ? 3 : len_of_num%3);

start_of_num
是為了跳過負號,獲得數字部分開始的索引。

len_of_num%3 == 0 ? 3 : len_of_num%3
如果數字部分的長度能被3整除,為了不能在數字的一開頭就加上逗號,所以要使其為3以跳到下一個應該插入逗號的位置,這樣的位置(start_of_num + 3)才為第一個逗號應插入的索引。
如果數字部分的長度不能被3整數,直接對3取餘,start_of_num加上餘數就是第一個逗號應插入的索引。

# include <iostream>
# include <vector>

using namespace std;

int main()
{
    int a, b;
    cin >> a >> b;
    string str_sum = to_string(a + b);

    int str_size       = str_sum.size();  // 未加逗號的結果字串的長度
    int start_of_num   = str_sum[0] == '-' ? 1 : 0;  // 根據是否有負號來求得第一個數字字元的索引
    int len_of_num     = str_size - start_of_num;  // 求得未加逗號的結果字串的數字部分的長度
    int start_of_comma = start_of_num + (len_of_num%3 == 0 ? 3 : len_of_num%3);  // 求得第一個逗號應插入的位置(關鍵!!!!)
    
    //從第一個逗號處開始每隔三位數字插入一個逗號
    for(int i = start_of_comma;i < str_size;i+=3)
            str_sum.insert(i++, ",");  // 插入後i指向當前字元而不是指向逗號處,所以i++跳過已經插入的逗號
    
    cout << str_sum << endl;

    return 0;
}

相關文章