大整数加法

2018-04-18 / ACM-ICPC Common Lisp

 

#include <iostream>
#include <cstdio>
#include <string>
using namespace std;


int main() {
    // 1. 开始程序,输入两个字符串
    string str1, str2;
    cin >> str1 >> str2;

    // 2. 初始化一个数组,并每个元素初始化为0
    int a[1000];
    for (int i = 0; i < 1000; ++i) a[i] = 0;

    // 3. 把str1的每一位从最后开始拿(依次为str[str1.length()-1],str[str1.length()-2],...,str1[0]}),依次累加到a[0],a[1],a[2]...,a[str1.length()-1]
    for (int i = 0; i < str1.length(); ++i) {
        a[i] += ( str1[str1.length()-i-1] - '0' ); // 把对应位置字符拿出来,然后-'0'则是字符对应的数字
    }
    // 4. 把str2的每一个从最后开始拿,同3操作。
    for (int i = 0; i <str2.length(); ++i) {
        a[i] += ( str2[str2.length()-i-1] - '0' );
    }

    // 5. 从最低位,也就是0下标开始对数组a进行整理(也是就我们加法的时候所谓的进位。)
    for (int i = 0; i < 999; ++i) {
        int tmp = a[i] / 10; // 拿出除去个位的部分,如:a[i] = 23;则tmp为2,进位操作的时候3保留下来,2,加到高位去。
        a[i+1] += tmp; // 进位操作
        a[i] %= 10;
    }

    // 6. 寻找最高位不为零的位置。当所有数字都为0时,high会为-1,则需要将high赋值为0
    int high = 999;
    while (0 == a[high]) --high;
    high = high > 0 ? high : 0; // 不想用if-else来操作。

    // 7. 从最高位开始输出
    for (int i = high; i >= 0; --i) cout << a[i];
    cout << endl;
    return 0;
}

Common Lisp代码

(let ((a (read)) (b (read)))
    (format t "~D~%" (+ a b)))