A + B Problem (Big integer versi…

A <wbr>+ <wbr>B <wbr>Problem <wbr>(Big <wbr>integer <wbr>version) <wbr>【高精度】1202:A + B Problem (Big integer version) 【高精度】

Time Limit:1000MS Memory Limit:65536K
Total Submit:491 Accepted:79 Page View:235

[Submit] [Status] [Discuss]

Font Size: Aa Aa Aa

Description

Input and output are the same with problem 1001.

But A and B are big non-negative integers.
The biggest integer is less than 10^500.

Input

Input contains multiple test cases. 

Each case have two big non-negative integers a,b.

Output

For each case,Output a+b.

Sample Input

1234567890987654321

9876543210123456789
123456789123456789
321654987321654987
9081321110693270343633073697474256143563558458718976746753830538032062222085722974121768604305613921745580037409259811952655310075487163797179490457039169594160088430571674960498834085812920457916453747019461644031395307920624947349951053530086146486307198155590763466429392673709525428510973272600608981219760099374675982933766845473509473676470788342281338779191792495900393751209539300628363443012
6538005862664913074813656220643842443844131905754565672075358391135537108795991638155474452610874309742867231360502542308382199053675592825240788613991898567277116881793749340807728335795394301261629479870548736450984003401594705923178314906195914825136973281314862289454100745237769034410057080703111299605127114594552921209928891515242515620324828055912854227507525717981351447473570262981491527798

Sample Output

11111111101111111110

445111776445111776
15619326973358183418446729918118098587407690364473542418829188929167599330881714612277243056916488231488447268769762354261037509129162756622420279071031068161437205312365424301306562421608314759178083226890010380482379311322219653273129368436282061311444171436905625755883493418947294462921030353303720280824887213969228904143695736988751989296795616398194193006699318213881745198683109563609854970810

Hint

Note that there are leading zeros!

 

解题思路
首先要解决的就是存储1000位整数的问题。
显然,任何C/C++固有类型的变量都无法保存它。
最直观的想法是可以用一个字符串来保存它。
字符串本质上就是一个字符数组,因此为了编程更方便,我们也可以用数组unsigned an[1001]来保存一个1000位的整数
让an[0]存放个位数,an[1]存放十位数,an[2]存放百位数
那么如何实现两个大整数相加呢?
方法很简单,就是模拟小学生列竖式做加法,从个位开始逐位相加,超过或达到10则进位。
也就是说,用unsigned an1[1001]保存第一个数,用unsigned an2[1000]表示第二个数,然后逐位相加,相加的结果直接存放在an1中。
要注意处理进位。

#include<iostream>
#include<cstring>
using namespace std;
#define max 1001
int a[max+10];
int b[max+10];
char x[max+10];
char y[max+10];
int main()
{
    int i,j,k;
 while(cin>>x>>y)
 {
  memset(a,0,sizeof(a));
  memset(b,0,sizeof(b));
  int xlen=strlen(x),ylen=strlen(y);
  j=0;
  for(i=xlen-1;i>=0;i--)
   a[j++]=x[i]-'0';
  k=0;
  for(i=ylen-1;i>=0;i--)
   b[k++]=y[i]-'0';
     for(i=0;i<max;i++)
  {
   a[i]+=b[i];
   if(a[i]>9)
   {
   a[i]-=10;
   a[i+1]++;
   }
  }
     bool flag=false;//此变量用于跳过多余的0 
  for(i=max;i>=0;i--)
  {
    if(flag)
     cout<<a[i];
    else if(a[i])//碰到第一个非0的值,就说明多余的0已经都跳
    {
    cout<<a[i];
    flag=true;
    }
  }
  if(!flag) //结果为0特殊处理 
   cout<<"0";
  cout<<endl;
 }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值