大整数加法

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX_LEN 200

int an1[MAX_LEN+10];
int an2[MAX_LEN+10];
char szLine1[MAX_LEN+10];
char szLine2[MAX_LEN+10];

int main()
{
    scanf("%s", szLine1);
    scanf("%s", szLine2);
    int i, j;
    
    //库函数memeset将地址an1开始的sizeof(an1)字节内容置成0
    //sizeof(an1)的值就是an1的长度

    memset( an1, 0, sizeof(an1));       
    memset( an2, 0, sizeof(an2));

    //下面将szLine1中存储的字符串形式的整数转换到an1中去,
    //an1[0]对应于个位
     int nLen1 = strlen( szLine1);
     j = 0;
     for( i = nLen1 - 1;i >= 0 ; i --)
          an1[j++] = szLine1[i] - '0';    

     int nLen2 = strlen(szLine2);
     j = 0;
     for( i = nLen2 - 1;i >= 0 ; i--)
          an2[j++] = szLine2[i] - '0';

     for( i = 0;i < MAX_LEN ; i ++ ) 
     { 
         an1[i] += an2[i];            //逐位相加
         if( an1[i] >= 10 )    //看是否要进位  
         {        
                 an1[i] -= 10;
                 an1[i+1] ++;                 //进位
         }
     }

     bool bStartOutput = false;     //此变量用于跳过多余的0
     for( i = MAX_LEN; i >= 0; i-- ) 
     {
          if( bStartOutput)    
              printf("%d", an1[i]);  //如果多余的0已经都跳过,则输出     
          else if( an1[i] ) {           
               printf("%d", an1[i]);
               bStartOutput = true; //碰到第一个非0的值,就说明多余的0已经都跳过                  
          }
     }
     if(!bStartOutput)      //结果为0特殊处理 
          printf("0");

     system("pause"); 
     return 0;
}
/******************************************
/*    杭电ACM1002:A + B Problem II
/*    2010/10/1
/*    VC 6.0  by 52coder
/*    persever2009@gmail.com
******************************************/
#include <iostream>
using namespace std;
 
string Sum_calc(string s1,string s2)
{
    int length;
    //比较s1,s2的长度
    if (s1.length()>=s2.length())
    {
        length=s1.length();
        string tmp(s1.length()-s2.length(),'0');
        s2=tmp+s2;
    }
    else
    {
        length=s2.length();
        string tmp(s2.length()-s1.length(),'0');
        s1=tmp+s1;
    }
    string sum(length,'0');
    //carry 进位标志位
    int carry = 0;
    for (int k=length-1;k!=-1;--k) //注意从低位开始进行运算
    {
        //字符'0'对应ASCII码为48
        sum[k]=(s1[k]+s2[k]+carry-96)%10+48; //字符和数字的转换需要注意
        carry=(s1[k]+s2[k]+carry-96>9);
    }
    //最高位进位后,进位处理
    if (carry)
        sum='1'+sum;
 
    return sum;
 
}
 
void main()
{
    int T;    //The number of test cases;
    cin>>T;
   //use the dynamic array when not knowing the dimension before compiling;
    string *A = new string[T];
    string *B = new string[T];
    string *Sum = new string[T];
    for (int i=0; i!=T; ++i)
    {
        cin>>A[i]>>B[i];
        Sum[i] = Sum_calc(A[i], B[i]);
    }
    for (int j=0; j!=T; ++j)
   {
    cout<<"Case "<<j+1<<":"<<endl<<A[j]<<" + "<<B[j]<<" = "<<Sum[j];
    if(i!=T-1)
    cout<<endl;
   }


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值