A*B大数问题-处理负号

写在前面:这里是小王成长日志,一名在校大学生,想在学习之余将自己的学习笔记分享出来,记录自己的成长轨迹,帮助可能需要的人。欢迎关注与留言。
A*B大数问题-处理负号_第1张图片

题目描述

求两数的积。

输入格式

两行,两个整数。

输出格式

一行一个整数表示乘积。

输入输出样例
输入

1 
2

输出

2

说明/提示
每个数字不超过 1 0 2000 10^{2000} 102000,需用高精。

题解

#include 
#include  

using namespace std;

int a[2020],b[2020],c[2020];//a,b存储输入的大数,c存储结果 


int mymultiply(string num1,string num2);
int main(){
	string num1,num2;
	cin>>num1>>num2; 
	int lenc = mymultiply(num1,num2);
	if(lenc==0)
		cout<<0; 
	if(c[lenc-1]==-1) cout<<'-';
	for(int i=lenc-2;i>=0;i--)
		cout<<c[i]; 
	return 0; 
} 

//返回结果的长度 
int mymultiply(string num1,string num2){
	int i,j; 
	//处理负号 
	int flag1 = ((num1[0]=='-')?1:0);
	int flag2 = ((num2[0]=='-')?1:0);
	
	int len1=num1.length(),len2=num2.length(); //len1 len2未去除可能存在的符号位长度 
	int max=len1+len2;//两数相加结果长度不超度较大的数的长度加1 减不减符号位长度意义不大 
	
	//翻转保存 
	for(i=0,j=len1-1;j>=flag1;i++,j--)//有负号则从num1[1]开始考虑 
		a[i]=num1[j]-'0';
	for(i=0,j=len2-1;j>=flag2;i++,j--)
		b[i]=num2[j]-'0';
		
	//模拟乘法运算
	len1-=flag1,len2-=flag2;//去除可能存在的符号位长度 
	for(i=0;i<len1;i++){
		for(j=0;j<len2;j++){
			c[i+j]+=a[i]*b[j];
			if(c[i+j]>=10){//模拟进位 
				c[i+j+1]+=c[i+j]/10; 
				c[i+j]%=10;
			} 
		} 
	} 

	//去除高位多余的0
	i=max-1;
	while(c[i]==0&&i>=0)
		i--;
	if(i!=-1){
		if(flag1+flag2!=0&&flag1*flag2!=1) 
			c[i+1]=-1;
		return i+2;
	} 
	return i+1; 
}

都看到这里了,各位哥哥姐姐叔叔阿姨给小王点个赞 关个注 留个言吧,和小王一起成长吧,你们的关注是对我最大的支持。
有事没事进来看看吧 : 小王的博客目录索引
C语言专栏看这 : C/C++专栏


如果以上内容有任何不准确或遗漏之处,或者你有更好的意见,就在下面留个言让我知道吧-我会尽我所能来回答。

你可能感兴趣的:(OJ,#,蓝桥,高精度,大数)