AcWing 793. 高精度乘法——算法基础课题解

AcWing 793. 高精度乘法

题目描述

给定两个非负整数(不含前导 00) A 和 B,请你计算 A×B 的值。

输入格式

共两行,第一行包含整数 A,第二行包含整数 B。

输出格式

共一行,包含 A×B 的值。

数据范围

1≤A 的长度≤100000,

0≤B≤100000

输入样例

cpp 复制代码
2
3

输出样例

cpp 复制代码
6

思路

将 B 看成一个整体再相乘,不要一位一位的乘!注意结果的前导 0!

C++

cpp 复制代码
#include <iostream>
#include <string>

using namespace std;

void reverse(string &s) {
    size_t n = s.length();
    for (int i = 0; i < n / 2; ++i) {
        swap(s[i], s[n - i - 1]);
    }
}

string mul(string &a, int b) {
    reverse(a);
    int carry = 0;
    string result;
    for (size_t i = 0; i < a.size() || carry; ++i) {
        if (i < a.size()) carry += (a[i] - '0') * b;
        result.push_back(carry % 10 + '0');
        carry /= 10;
    }
    reverse(result);
    if (result[0] == '0') return "0";
    return result;
}

int main() {
    string a;
    int b;
    cin >> a >> b;
    cout << mul(a, b);
    return 0;
}
cpp 复制代码
#include <iostream>
#include <vector>

using namespace std;


vector<int> mul(vector<int> &A, int b)
{
    vector<int> C;

    int t = 0;
    for (int i = 0; i < A.size() || t; i ++ )
    {
        if (i < A.size()) t += A[i] * b;
        C.push_back(t % 10);
        t /= 10;
    }

    while (C.size() > 1 && C.back() == 0) C.pop_back();

    return C;
}


int main()
{
    string a;
    int b;

    cin >> a >> b;

    vector<int> A;
    for (int i = a.size() - 1; i >= 0; i -- ) A.push_back(a[i] - '0');

    auto C = mul(A, b);

    for (int i = C.size() - 1; i >= 0; i -- ) printf("%d", C[i]);

    return 0;
}

Go

go 复制代码
package main

import (
	"fmt"
	"strings"
)

func reverse(s string) string {
	r := []rune(s)
	l := len(r)
	for i := 0; i < l/2; i++ {
		r[i], r[l-i-1] = r[l-i-1], r[i]
	}
	return string(r)
}

func mul(a string, b int) string {
	a = reverse(a)
	carry := 0
	var result strings.Builder
	for i := 0; i < len(a) || carry > 0; i++ {
		if i < len(a) {
			carry += int(a[i]-'0') * b
		}
		result.WriteByte(uint8(carry%10) + '0')
		carry /= 10
	}
	resStr := reverse(result.String())
	if resStr[0] == '0' {
		return "0"
	}
	return resStr
}

func main() {
	var a string
	var b int
	fmt.Scanln(&a)
	fmt.Scanln(&b)
	fmt.Println(mul(a, b))
}

模板

cpp 复制代码
// C = A * b, A >= 0, b >= 0
vector<int> mul(vector<int> &A, int b)
{
    vector<int> C;

    int t = 0;
    for (int i = 0; i < A.size() || t; i ++ )
    {
        if (i < A.size()) t += A[i] * b;
        C.push_back(t % 10);
        t /= 10;
    }

    while (C.size() > 1 && C.back() == 0) C.pop_back();

    return C;
}
相关推荐
kylezhao201915 分钟前
C# 文件的输入与输出(I/O)详解
java·算法·c#
CodeByV32 分钟前
【算法题】堆
算法
kaikaile199541 分钟前
A星算法避开障碍物寻找最优路径(MATLAB实现)
数据结构·算法·matlab
今天_也很困1 小时前
LeetCode 热题100-15.三数之和
数据结构·算法·leetcode
企业对冲系统官1 小时前
基差风险管理系统日志分析功能的架构与实现
大数据·网络·数据库·算法·github·动态规划
ldccorpora1 小时前
GALE Phase 1 Chinese Broadcast News Parallel Text - Part 1数据集介绍,官网编号LDC2007T23
人工智能·深度学习·算法·机器学习·自然语言处理
千金裘换酒1 小时前
LeetCode 数组经典题刷题
算法·leetcode·职场和发展
fie88892 小时前
MATLAB有限元框架程序
python·算法·matlab
小郭团队2 小时前
1_5_五段式SVPWM (传统算法反正切+DPWM1)算法理论与 MATLAB 实现详解
人工智能·嵌入式硬件·算法·dsp开发
思成Codes3 小时前
ACM训练:接雨水3.0——动态接雨水
数据结构·算法