讀入多組大整數(每組以單一 0 結束,整組測資以 T 表示組數),輸出每組數字之和。數字長度可達 200 位,需自行實作高精度加法。
struct BigNumber {
int data[200]; // 低位在前:data[0] 為個位
int len; // 有效位數
BigNumber() : len(1) { memset(data, 0, sizeof(data)); }
BigNumber(char *s) { *this = s; }
BigNumber& operator=(char *s);
BigNumber operator+(BigNumber& a);
void clearLeadZero();
void print();
};
memset 清零)BigNumber& BigNumber::operator=(char *str) {
memset(data, 0, sizeof(data)); // 關鍵:清除舊資料殘留
len = strlen(str);
for (int i = 0; i < len; ++i)
data[i] = str[len - 1 - i] - '0';
return *this;
}
BigNumber BigNumber::operator+(BigNumber& a) {
BigNumber z;
int carry = 0, i = 0, j = 0;
for (; carry || i < len || j < a.len; ++i, ++j) {
int sum = data[i] + a.data[j] + carry;
z.data[i] = sum % 10;
carry = sum / 10;
}
z.len = i;
z.clearLeadZero();
return z;
}
void BigNumber::clearLeadZero() {
while (len > 1 && !data[len - 1]) --len;
}
int main() {
int T; scanf("%d", &T);
while (T--) {
BigNumber ans = "0";
char s[200];
while (scanf("%s", s) != EOF) {
if (s[0] == '0' && s[1] == '\0') break;
ans = ans + BigNumber(s);
}
ans.print();
if (T) puts(""); // 組別間空行
}
return 0;
}
memset 清零,否則殘留舊資料導致錯誤。carry || i < len || j < a.len 確保進位不遺漏。