大(正)整数加法

数字太大太大,long long放不下,因此用字符数组暂存,a[0],b[0]存放数的最低位,所以开数组来存是明智的选择。。。。。

#include <cstdio>
#include <cstring>

#define MAXN 210

int a[MAXN+10];
int b[MAXN+10];
char s1[MAXN+10];
char s2[MAXN+10];

int main()
{
    scanf("%s", s1);
    scanf("%s", s2);
    int i, j;

    //赋初值 0 ,相当于用 0 填充数组
    memset( a, 0, sizeof(a));
    memset( b, 0, sizeof(b));

    // 将字符转换为相对应的数字,存入a[]、b[]数组中,a[0]、b[0]对应于个位
    int len1 = strlen( s1);
    j = 0;
    for( i = len1 - 1; i >= 0 ; i --)
        a[j++] = s1[i] - '0';

    int len2 = strlen(s2);
    j = 0;
    for( i = len2 - 1; i >= 0 ; i--)
        b[j++] = s2[i] - '0';

    for( i = 0; i < MAXN ; i ++ ) {
        a[i] += b[i];            //逐位相加,相加最大值也就 18 ,放心加
        if( a[i] >= 10 ) {  //看是否要进位
            a[i] -= 10;
            a[i+1] ++;                 //进位
        }
    }

    int zor_num = 0 ;     //此变量用于跳过多余的0
    for( i = MAXN; i >= 0; i-- ) {
        if( zor_num )
            printf("%d", a[i]);  //如果多余的0已经都跳过,则输出
        else if( a[i] ) {
            printf("%d", a[i]);
            zor_num = 1 ; //碰到第一个非0的值,就说明多余的0已经都跳过 (去前导 0 ,方法不唯一)
        }
    }
    if(!zor_num)      //不满足上面条件,zor_num任然是 0
        printf("0");
    return 0;
}

加法完成。。。。。。。。。。。。

猜你喜欢

转载自blog.csdn.net/sf_yang35/article/details/81835757