【洛谷 P1303】A*B Problem 题解(高精度+字符串)

A*B Problem

题目描述

给出两个非负整数,求它们的乘积。

输入格式

输入共两行,每行一个非负整数。

输出格式

输出一个非负整数表示乘积。

样例 #1

样例输入 #1

1 
2

样例输出 #1

2

提示

每个非负整数不超过 1 0 2000 10^{2000} 102000


思路

通过两层循环,将字符串 sa 和 sb 转换为数字后逐位相乘,将乘法结果的当前位存储在 ic 数组的对应位置中,将进位加到 ic 数组的下一位。

注意:

  1. 必须去除前导零,否则会导致WA。
  2. ic 数组的低位存储的是结果数值的高位。
  3. 结果可能为 0,当 sc 为空字符串时直接输出 0。

AC代码

#include 
#include 
#include 
#define AUTHOR "HEX9CF"
using namespace std;

const int N = 1e4 + 5;

string sa, sb, sc;
int ic[N];

int main() {
    memset(ic, 0, sizeof(ic));
    cin >> sa >> sb;
    int la = sa.length();
    int lb = sb.length();
    for(int i = la - 1; i >= 0; i--) {
        for(int j = lb - 1; j >= 0; j--) {
            int mul =  (sa[i] - '0') * (sb[j] - '0');
            int sum = mul + ic[i + j + 1];
            ic[i + j + 1] = sum % 10;
            ic[i + j] += sum / 10;
        }
    }
    sc = "";
    for(int i = 0; i < la + lb; i++) {
        if(sc.empty() && !ic[i]) {
            continue;
        }
        sc += to_string(ic[i]);
    }
    if(sc.empty()) {
        cout << 0 << endl;
    } else {
        cout << sc << endl;
    }
    return 0;
}

你可能感兴趣的:(数据结构与算法,算法,c++,数据结构)