高精度加减法

P1601 A+B Problem(高精度加法)

题目: P1601 A+B Problem(高精).

题目描述
高精度加法,相当于a+b problem,不用考虑负数.

输入格式
分两行输入。a,b≤10^500

输出格式
输出只有一行,代表a+b的值

输入输出样例
例一:输入
1
1
输出
2

例二:输入
1001
9099
输出
10100

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int main()
{
	string a,b;
	int numa[2020],numb[2020],num[2020];
	cin>>a>>b;
	int lena=a.size();
	int lenb=b.size();
	int lennum=0,i=0;
	for(i=0;i<lena;i++)
	{
		numa[i]=a[i]-'0';
	} 
	 for(i=0;i<lenb;i++)
	{
	 	numb[i]=b[i]-'0';
    }
	for(i=0;lena>0||lenb>0;i++)
	{
		if(lena>0&&lenb>0)
		{
			num[i]+=numa[lena-1]+numb[lenb-1];//数组从0开始,所以lena-1; 
			lena--;
			lenb--;
		} 
		else if(lena==0)//lenb>lena
		{
			num[i]+=numb[lenb-1];
			lenb--;
		}
		else if(lenb==0)//lena>lenb
		{
			num[i]+=numa[lena-1];
			lena--;
		}
		if(num[i]>=10)//加法进位 
		{
			num[i+1]++;
			num[i]%=10;//求余 
		}
	}
	lennum=i;
	if (num[lennum]<= 0)//因为最后i多加1,若最后一次加法未进位,则需lennum--; 
		lennum--;
	for (i=lennum;i>=0;i--)
		cout<<num[i];
 } 

P2142 高精度减法

题目: P2142 高精度减法.

题目描述
高精度减法。

输入格式
两个整数 a,ba,b(第二个可能比第一个大)。

输出格式
结果(是负数要输出负号)。

输入输出样例
输入
2
1
输出
1
说明/提示
20% 数据 a,b 在 long long 范围内;
100% 数据 0<a,b≤10 ^10086 。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 10010
using namespace std;
string a,b;
int numa[N],numb[N],num[N];
int lena,lenb;
int JUDGE()//判断a与b的大小,a>b时真,否则假 
{
	if(lena>lenb)
	return true;
	else if(lena==lenb)
	{
		int i=0,j=0;
		while(numa[i]==numb[j])//a==b时 
		{
			i++;
			j++;
			if(i=lena)
			return 2;
		}
		if(numa[i]>numb[j]) //从右往左开始判大小 
		return true;
		else
		return false;
	}
	else
	   return false;
}
int main()
{
	cin>>a>>b;
	memset(num,0,sizeof(num));
    lena=a.size();
    lenb=b.size();
	int i,lennum=0,flag=1,temp;
	for(i=0;i<lena;i++)
	numa[i]=a[i]-'0';
	for(i=0;i<lenb;i++)
	numb[i]=b[i]-'0';
	flag=JUDGE();
	if(flag!=1)//b>=a时,交换a,b 
	{
		for(i=0;i<lena;i++)
		{
			temp=numa[i];
			numa[i]=numb[i];
			numb[i]=temp;
		}
	    for(i;i<lenb;i++)
	    {
	    	numa[i]=numb[i];
		}
		temp=lena;
		lena=lenb;
		lenb=temp;
	}
	for(i=0;lena>0||lenb>0;i++)//减法 
	{
		  if(lenb>0)
		  {
		  	num[i]+=numa[lena-1]-numb[lenb-1];
		  	lena--;
		  	lenb--;
		  } 
		  else if(lenb<=0)
		  {
		  	num[i]+=numa[lena-1];
		  	lena--;
		  }
		  if(num[i]<0)
		  {
		  	num[i+1]--;
		  	num[i]+=10;
		  }
	}
	lennum=i;
	if(flag==2)
	cout<<0;
	else
	{
		if(flag!=1)
		cout<<"-";
		while(num[lennum]==0)
		lennum--;
		for(i=lennum;i>=0;i--)//逆序输出 
		cout<<num[i]; 	
	}
	return 0;
}

P1303 A*B Problem(高精度乘法)

题目: P1303高精度乘法.
题目描述
求两数的积。

输入格式
两行,两个整数。

输出格式
一行一个整数表示乘积。

输入输出样例
输入
1
2
输出
2
说明/提示
每个数字不超过 10^ 2000,需用高精。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 10010
using namespace std;
string a,b;
int numa[N],numb[N],num[N];
int lena,lenb;
int main()
{
	cin>>a>>b;
	memset(num,0,sizeof(num));
	lena=a.size();
    lenb=b.size();
	int i,j,lennum=0;
	for(i=1;i<=lena;i++)
	numa[i]=a[lena-i]-'0';//逆序存储 
	for(i=1;i<=lenb;i++)
	numb[i]=b[lenb-i]-'0';
	for(i=1;i<=lena;i++)
	{
		for(j=1;j<=lenb;j++)
		{
			num[i+j-1]+=numa[i]*numb[j];
			num[i+j]+=num[i+j-1]/10;
			num[i+j-1]%=10;
		}
	}
	lennum=i+j;
	if(num[lennum+1]>0)
	lennum++;
	while(num[lennum]==0&&lennum>1)
	lennum--;
	for(i=lennum;i>0;i--)
	cout<<num[i];
	return 0;
} 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值