P1303 A*B Problem

题目描述

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

输入格式

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

输出格式

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

样例 #1

样例输入 #1

1 
2

样例输出 #1

2

提示

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

解析

一、主要思路

参考博客:
跳转链接,来源洛谷

主要思路如下:进行乘法的思路参考手动运算乘法的过程。

  1. 输入两个大数字,用字符串存贮。
  2. 将两个字符串翻转,这里是为了方便模拟乘法中从最后一位开始的运算过程。
  3. 对结果数组进行定义,当一个是n位数,一个是m位数,由于结果数组不会超过n+m位,直接假设结果位n+m位。
  4. 对结果数组进行处理(对应图中第一次处理结果):
for(int i = 0; i < b_len; i ++){
		for(int j = 0; j < a_len; j ++){
			c[i+j]+=bg[i]*ag[j];
		}
	}
  1. 对最终结果进行处理(对应图中最终结果):
for(int i = 0; i < c_len; i++){
		c[i+1]+=c[i]/10;
		c[i]=c[i] % 10;
	}

在这里插入图片描述
6. 对输出结果进行处理,当1X1时,这个程序会输出01,则判断得到第一个不为0的数字再输出,这里设置了标志位flag。

int flag = 0;
	for(int i=c_len-1; i>=0; i --){
		if(c[i] != 0){
			flag = 1;
		}
		if(flag == 1){
			cout << c[i];
		}
	}
	if(flag == 0){
		cout << 0;
	}

二、代码

完整代码如下:

#include <iostream>
using namespace std;
void getResult(string a, string b){
	int a_len = a.length();
	int b_len = b.length();
	int ag[a_len+5];
	int bg[b_len+5];
	//得到a, b的数组 
	for(int i = 0; i < a_len; i ++){
		ag[i] = a[a_len-i-1] - '0';
	}
	for(int i = 0; i < b_len; i ++)
		bg[i] = b[b_len-i-1] - '0';
	
	//c的数组定义与初始化 
	int c_len = a_len + b_len;
	int c[c_len+5];
	for(int i = 0; i < c_len; i ++){
		c[i] = 0;
	}
	
	//处理c数组 
	for(int i = 0; i < b_len; i ++){
		for(int j = 0; j < a_len; j ++){
			c[i+j]+=bg[j]*ag[i];
		}
	}
	for(int i = 0; i < c_len; i++){
		c[i+1]+=c[i]/10;
		c[i]=c[i] % 10;
	}
	
	//输出结果 
	int flag = 0;
	for(int i=c_len-1; i>=0; i --){
		if(c[i] != 0){
			flag = 1;
		}
		if(flag == 1){
			cout << c[i];
		}
	}
	if(flag == 0){
		cout << 0;
	}
}
int main(){
	string a, b;
	cin >> a >> b;
	getResult(a, b);
}

三、注意点

  1. 注意处理当输入含0的情况。
  2. 对结果的位数进行灵活处理:
    当一个是n位数,一个是m位数,两数相乘的时候,结果至少为max(n, m)位,至多位n+m位。
  3. 处理c数组的时候,循环内层外层可调换。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值