洛谷P1303 A*B Problem(高精,可计算负数)

6 篇文章 0 订阅

题目描述

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

输入格式

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

输出格式

输出一个整数表示乘积。

输入输出样例

输入 

1 
2

输出 

2

说明/提示

每个整数的绝对值不超过 10^{2000}。

解题思路:

首先,我们先判断输入的数是否为负数,若为负数则先用substr()去掉负号,同时用一个变量记录下来;接着,因为数据可能太大,所以输入只能用字符串,我们需要把字符串的每一位倒序存进整型数组,倒序是为了方便计算;下一步,我们要将两个数组中的每一位依次相乘,都相乘完之后再进位;然后,去掉末尾没用的0,最后,判断结果是否为负数,是则先输出负号再输出结果,否则直接输出结果。

计算的公式s[i+j]+=c[i]*d[j],i,j 代表的是第几位(从0位开始算起)

举个例子  253 * 167

位数        4      3      2     1      0

d                             1     6      7

c                             2     5      3

s                             3     18     21     //这一行是c[0]*d[j] 

                       5     30    35             //这一行是c[1]*d[j]

               2      12   14                      //这一行是c[2]*d[j]

进位算和  4      2      2      5       1      

代码:

#include<bits/stdc++.h>
using namespace std;
int s[50001]= {0},c[50001],d[50001];
int main() {
	string a,b;
	cin>>a>>b;
	int l1,l2,i,j,m=1,n=1;
	l1=a.length();
	l2=b.length();
	if(a[0]=='-') { //去掉负号并做记录 
		m=-1;
		a=a.substr(1,l1-1);
		l1--;
	} 
	if(b[0]=='-') {  //去掉负号并做记录 
		n=-1;
		b=b.substr(1,l2-1);
		l2--;
	} 
	for(i=l1-1,j=0; i>=0; i--) //将a到存进c数组中
		c[j++]=a[i]-'0';
	for(i=l2-1,j=0; i>=0; i--) // 将b到存进d数组中
		d[j++]=b[i]-'0';
	for(i=0; i<l1; i++)    //c的每一位依次乘以d的每一位
		for(j=0; j<l2; j++)
			s[i+j]+=c[i]*d[j];
	for(i=0; i<l1+l2; i++) // 从头到尾依次进位
		if(s[i]>9) {
			s[i+1]+=s[i]/10;
			s[i]%=10;
		}
	while(!s[i]&i>0) i--;//去掉后面多余的0
	if(m*n<0&&c[0]!=0&&d[0]!=0) cout<<"-"; //判断结果是否是负数 
	for(i; i>=0; i--)
		cout<<s[i];
	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值