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;
}