https://www.qduoj.com/problem/596
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<vector>
#include<queue>
#include<cmath>
using namespace std;
typedef long long ll;
ll t1[55],t2[100];
ll temp[4];
int main(){
string a;
ll b;
cin>>a>>b;
//将b的各位分开
temp[0]=b%10;//个位
temp[1]=(b/10)%10;//十位
temp[2]=(b/100)%10;//百位
temp[3]=b/1000;//千位
ll len=a.size();//大数a的长度
ll jinwei=0;
ll cnt=0;
/******************加法部分***********************************/
if(len<=4){//a<=b的时候,直接运算
ll summ=0;
for(ll i=0;i<len;i++){
summ+=(a[len-i-1]-'0')*(ll)(pow((double)10,i));
}
printf("%lld",summ+b);
}
else {//a>b的时候
for(ll i=len;i>0;i--){//从len开始,留一位0,用来存储最后的那个进位
if(cnt>3){//cnt>3说明b的最高位已经加过
t1[i]=(a[i-1]-'0'+jinwei)%10;
jinwei=(a[i-1]-'0'+jinwei)/10;
}
else {
t1[i]=(temp[cnt]+a[i-1]-'0'+jinwei)%10;
jinwei=(temp[cnt]+a[i-1]-'0'+jinwei)/10;
cnt++;
}
}
t1[0]=jinwei;//最后的进位
ll tt=0;
if(t1[0]==0)
tt=1;
for(;tt<=len;tt++){
printf("%lld",t1[tt]);
}
}
printf("\n");
/***************乘法部分*****************************************/
jinwei=0;
for(ll i=0;i<4;i++){
cnt=i;
jinwei=0;
//模拟乘法的过程
for(ll j=len-1;j>=0;j--){
t2[cnt]=(t2[cnt]+((a[j]-'0')*temp[i]+jinwei));
jinwei=t2[cnt]/10;//进位
t2[cnt]%=10;//该位的数字
cnt++;
}
t2[cnt]=jinwei;
}
ll flag=0,pp=0;
for(ll i=cnt;i>=0;i--){
//去掉前导零
if(t2[i]==0){
if(flag==0){
continue;
}
else {
pp=1;
printf("0");
}
}
else {
flag=1;
pp=1;
printf("%lld",t2[i]);
}
}
//如果全是零,就打印0
if(pp==0)
printf("0");
return 0;
}