題目描述:
給定兩個整數a和b,其表示形式是:從個位開始,每三位數用逗號」,」隔開。
現在請計算a+b的結果,並以正常形式輸出。
輸入:
輸入包含多組資料資料,每組資料佔一行,由兩個整數a和b組成(-10^9 < a,b < 10^9)。
輸出:
請計算a+b的結果,並以正常形式輸出,每組資料佔一行。
該題與2023年3月28日阿里內推筆試第一題很相似, 區別在於阿里那道題要求處理大數, 而且數字之間沒有」,」. 下面的分析與解法將考慮存在大數的情況.
因為輸入字串中存在逗號, 因此先對兩個字串進行預處理. 分配新的陣列, 在對原指標陣列遍歷的過程中將逗號去除, 複製到新的陣列.
如果兩個數字符號相同, 則進行加法, 所得結果符號與任一加數符號相同; 如果兩個數字符號相反, 則進行減法, 所得結果符號與絕對值較大的加數符號相同.
1). 對於第一種情況, 從兩數字最低位 (字串最後一位) 開始相加, 依次向前, 注意對進製的處理. 處理完公共長度後, 需要對某一較長的數字的剩餘部分進行處理.
2). 對於第二種情況, 讓指標pa
指向絕對值較大的數,pb
指向絕對值較小的數, 注意字串長度要與之保持對應. 然後對兩者的絕對值進行相減, 所得結果非負, 最終符號由絕對值較大的數字決定.
對於結果陣列中的前導0需要跳過.
#include
#include
#include
#include
#define max_len 3000
void do_calc(char *a, char *b)
int i = lena - 1;
int j = lenb - 1;
while (i >= 0 && j >= 0)
// if either operand has some digits left
while (i >= 0)
while (j >= 0)
if (carry > 0)
} else else
int i = lena-1;
int j = lenb-1;
while (i >=0 && j>=0)
if (tmp < 0) else
result[k++] = tmp % 10 + '0';
}// pa points the larger number, so only one while
while (i >= 0)
if (tmp < 0) else
result[k++] = tmp % 10 + '0';}}
// k points to one element past the last element, so we go back
k--;
while (k > 0 && result[k] == '0')
k--; // skip leading zeros
if (k == 0 && result[k] == '0')
if (neg)
while (k >= 0)
printf("\n");
}void add_number(char *a, char *b)
pa++;
}*pa2 = '\0';
while (*pb)
pb++;
}*pb2 = '\0';
do_calc(a2, b2);
}int main()
}
九度題目1003 A B
題目1003 a b 題目描述 給定兩個整數a和b,其表示形式是 從個位開始,每三位數用逗號 隔開。現在請計算a b的結果,並以正常形式輸出。輸入 輸入包含多組資料資料,每組資料佔一行,由兩個整數a和b組成 10 9 a,b 10 9 輸出 請計算a b的結果,並以正常形式輸出,每組資料佔一行。樣例...
題目1003 A B 字串轉數字
每次給你兩個數,數的形式是每三位有乙個間隔符 計算兩數之和。兩個問題,一 如何讀入?我們可以先用字串讀入,再作處理。第 二 如何處理?我們可以對字串逐一處理,轉化成數字,把間隔符忽略就可以了。坑點 負數問題,開頭注意判斷是否是負數,可以用bool儲存下來最後處理。created by alvinzh...
九度題目1015 還是A B
題目描述 讀入兩個小於10000的正整數a和b,計算a b。需要注意的是 如果a和b的末尾k 不超過8 位數字相同,請直接輸出 1。輸入 測試輸入包含若干測試用例,每個測試用例佔一行,格式為 a b k 相鄰兩數字有乙個空格間隔。當a和b同時為0時輸入結束,相應的結果不要輸出。輸出 對每個測試用例輸...