大整数加法

来源:互联网 发布:淘宝信誉度等级表 编辑:程序博客网 时间:2024/06/06 06:46
#include <stdio.h>#include <string.h>#include <stdlib.h>#define MAX_LEN 200int 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;   }