P1601 A+B Problem(高精)
输入格式
分两行输入。a,b<=10e500;
输出格式
输出只有一行,代表a+b的值。
样例 #1
样例输入 #1
1
1
样例输出 #1
2
样例 #2
样例输入 #2
1001
9099
样例输出 #2
10100
#include<bits/stdc++.h>
using namespace std;
int main(){
int a[505]={0},b[505]={0};
string a0,b0;
cin>>a0>>b0;
int lena=a0.length(),lenb=b0.length();//取长度,并转换成数字;
for(int i=0;i<lena;i++)a[i]=a0[lena-i-1]-'0';
for(int i=0;i<lenb;i++)b[i]=b0[lenb-i-1]-'0';
for(int i=0;i<lenb;i++){//加减与进位
b[i]+=a[i];
b[i+1]+=b[i]/10;
b[i]%=10;
}
int ret=504;
while(ret>=0&&b[ret]==0)ret--;//除0
if(ret==-1)cout<<'0';//特殊情况
for(;ret>=0;ret--)cout<<b[ret];
}
思路:
1.以string的形式输入数字,之后倒序输入数组存放起来;
2.将一个数加到另一个数上即可,不用再开第三个数组;
3.倒序输出时要除掉一开始的0;
4.要注意结果为0的情况,这种情况下除0是会全部除掉的,单独讨论即可。
P1303 A*B Problem
输入格式
输入共两行,每行一个非负整数。
输出格式
输出一个非负整数表示乘积。
样例 #1
样例输入 #1
1
2
样例输出 #1
2
提示
每个非负整数不超过 10^2000。
#include<bits/stdc++.h>
using namespace std;
int main(){
int a[2001]={0},b[2001]={0},c[4001]={0};
string a0,b0;
cin>>a0>>b0;
int lena=a0.length(),lenb=b0.length();//得到位数,转换成数字
for(int i=0;i<lena;i++)a[i]=a0[lena-i-1]-'0';
for(int i=0;i<lenb;i++)b[i]=b0[lenb-i-1]-'0';
for(int i=0;i<lena;i++){//双循环相乘,得到相应位数的值
for(int j=0;j<lenb;j++){
c[i+j]+=a[i]*b[j];//相乘得到结果后即进行进位
c[i+j+1]+=c[i+j]/10;
c[i+j]%=10;
}
}
int i=4000;
while(i>=0&&c[i]==0)i--;//除0
if(i==-1)cout<<'0';//特殊情况
for(;i>=0;i--)cout<<c[i];
}
思路:
1.以string的形式输入数字,之后倒序输入数组存放起来;
2.需要开第三个数组存放;
3.计算时要注意位数,十位与百位相乘结果存在C数组的千位上,与其他相乘得到千位的数字一起相加即可;
3.倒序输出时要除掉一开始的0;
4.要注意结果为0的情况,这种情况下除0是会全部除掉的,单独讨论即可。