P1303 A*B Problem

题目背景

高精度乘法模板题。

题目描述

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

输入格式

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

输出格式

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

输入输出样例

输入 

1 
2

输出 

2

说明/提示

每个非负整数不超过 102000。

代码

无注释版

#include<bits/stdc++.h>
using namespace std;
char a[10010],b[10010];
int p[10010],q[10010],s[10010];
int main(){
	memset(p,0,sizeof(p));
	memset(q,0,sizeof(q));
	memset(s,0,sizeof(s));
	cin>>a>>b;
	int n=strlen(a);
	int m=strlen(b);
	for(int i=0;i<n;i++) p[n-i]=a[i]-48;
	for(int i=0;i<m;i++) q[m-i]=b[i]-48;
	for(int i=1;i<=n;i++){
		int x=0;
		for(int j=1;j<=m;j++){
			s[i+j-1]=s[i+j-1]+x+p[i]*q[j];
			x=s[i+j-1]/10;
			s[i+j-1]%=10;
		}
		s[i+m]=x;
	}
	int len=n+m;
	while(s[len]==0&&len>1){
		len--;
	}
	for(int i=len;i>=1;i--){
		cout<<s[i];
	}
}

有注释版 

#include<bits/stdc++.h>
using namespace std;

char a[10010], b[10010];  // 用于存储两个输入的大数
int p[10010], q[10010], s[20010];  // p 和 q 用于存储大数的数字形式,s 用于存储乘积结果

int main() {
    memset(p, 0, sizeof(p));  // 初始化 p 数组
    memset(q, 0, sizeof(q));  // 初始化 q 数组
    memset(s, 0, sizeof(s));  // 初始化 s 数组,存储乘积结果

    cin >> a >> b;  // 输入两个大数

    int n = strlen(a);  // 获取第一个数的长度
    int m = strlen(b);  // 获取第二个数的长度

    // 将第一个大数的每一位数字存入 p 数组,注意反向存储
    for (int i = 0; i < n; i++) {
        p[n - i] = a[i] - 48;  // 将字符转为数字,并存储在 p 数组中
    }

    // 将第二个大数的每一位数字存入 q 数组,注意反向存储
    for (int i = 0; i < m; i++) {
        q[m - i] = b[i] - 48;  // 将字符转为数字,并存储在 q 数组中
    }

    // 逐位计算乘积
    for (int i = 1; i <= n; i++) {
        int x = 0;  // 存储进位
        // 对于 p[i] 和 q[j],计算乘积并加到结果数组 s 中
        for (int j = 1; j <= m; j++) {
            s[i + j - 1] = s[i + j - 1] + x + p[i] * q[j];  // 当前位乘积加上之前的进位
            x = s[i + j - 1] / 10;  // 更新进位
            s[i + j - 1] %= 10;  // 当前位的数字(对 10 取余)
        }
        s[i + m] = x;  // 更新最后的进位
    }

    // 去除多余的前导零
    int len = n + m;  // 乘积的最大位数是 n + m
    while (s[len] == 0 && len > 1) {
        len--;  // 如果最高位是 0,减小结果的位数
    }

    // 输出结果
    for (int i = len; i >= 1; i--) {
        cout i >= 1; i--) {
        cout << s[i];  // 从高位到低位输出
    }

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值