51nod 1005 大数加法(大数模板)

给出2个大整数A,B,计算A+B的结果。
Input
第1行:大数A
第2行:大数B
(A,B的长度 <= 10000 需注意:A B有可能为负数)
Output
输出A + B
Input示例
68932147586
468711654886
Output示例
537643802472
这题坑的是有负数,并且是要处理前置零

#include<bits/stdc++.h>
using namespace std;
string add(string a,string b)
{
    string c;
    int len1=a.length();
    int len2=b.length();
    int len=max(len1,len2);
    for(int i=len1;i<len;i++)
        a="0"+a;
    for(int i=len2;i<len;i++)
        b="0"+b;
    int ok=0;
    for(int i=len-1;i>=0;i--)
    {
        char temp=a[i]+b[i]-'0'+ok;
        if(temp>'9')
        {
            ok=1;
            temp-=10;
        }
        else ok=0;
        c=temp+c;
    }
    if(ok) c="1"+c;
    int pos=-1;
    for(int i=0;i<c.length();i++){
    	if(c[i]=='0')pos=i;
    	else
    	break;
    }
//    cout<<pos<<endl;
	if(pos==c.length()-1)return "0";
    return c.substr(pos+1);
}

string sub(string a,string b)
{
    string c;
    bool ok=0;
    int len1=a.length();
    int len2=b.length();
    int len=max(len1,len2);
    for(int i=len1;i<len;i++)
        a="0"+a;
    for(int i=len2;i<len;i++)
        b="0"+b;
    if(a<b)
    {
        string temp=a;
        a=b;
        b=temp;
        ok=1;
    }
    for(int i=len-1;i>=0;i--)
    {
        if(a[i]<b[i]) 
        {
            a[i-1]-=1;
            a[i]+=10;
        }
        char temp=a[i]-b[i]+'0';
        c=temp+c;
    }
    int pos=0;
    while(c[pos]=='0' && pos<len) pos++;
    if(pos==len) return "0"; 
    if(ok) return "-"+c.substr(pos);
    return c.substr(pos);
}

int main()
{
	string s1,s2;
	while(cin>>s1>>s2){
		bool flag1=false,flag2=false;
		if(s1[0]=='-')flag1=true;
		if(s2[0]=='-')flag2=true;
		if(flag1==false&&flag2==false)cout<<add(s1,s2)<<endl;
		if(flag1==false&&flag2==true)cout<<sub(s1,s2.substr(1))<<endl;
		if(flag1==true&&flag2==false)cout<<sub(s2,s1.substr(1))<<endl;
		if(flag1==true&&flag2==true)cout<<"-"+add(s1.substr(1),s2.substr(1))<<endl;
	
	}	
	return 0;
} 
以后要用java写这类题了,c++写醉了



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值