代码改变世界

简单实现大数相加

2014-11-06 23:55  rangers  阅读(304)  评论(0编辑  收藏  举报

思路:

使用字符串来表示大数,然后对两个数字字符串使用类似列竖式的方式进行逐位相加求和。

123 +

  24

_____

 147

具体实现:

char* BigNumberAddition(const char* number1, const char* number2)
{
    if (!number1 || !number2)
    {
        return NULL;
    }

    int len1 = strlen(number1);
    int len2 = strlen(number2);
    //两个数相加 结果的位数 为大数的位数 或 大数的位数+1 
    int result_len = max(len1,len2) + 1;
    char* result = (char*)malloc(result_len + 1);
    memset(result,0,result_len + 1);

    int index = result_len;
    --index;
    --len1;
    --len2;
    while (len1 >= 0 && len2 >= 0)
    {
        //逐位相加
        result[index] += (number1[len1] - '0') + (number2[len2] - '0');
        if (result[index] >= 10)
        {
            //进位
            result[index - 1] += result[index] / 10;
            result[index] = result[index] % 10;
        }
        --index;
        --len1;
        --len2;
    }
    while(len1 >= 0)
    {
        result[index] += (number1[len1] - '0');
        if (result[index] >= 10)
        {
            //进位
            result[index - 1] += result[index] / 10;
            result[index] = result[index] % 10;
        }
        --len1;
        --index;
    }
    while(len2 >= 0)
    {
        result[index] += (number2[len2] - '0');
        if (result[index] >= 10)
        {
            //进位
            result[index - 1] += result[index] / 10;
            result[index] = result[index] % 10;
        }
        --len2;
        --index;
    }

    //去掉首位的0 
    int gap = result[0] == 0 ? 1 : 0;
    for (int i = 0; i < result_len; i++)
    {
        result[i] = result[i + gap] + '0';
    }
    result[result_len - gap] = '\0';
    return result;
}

注意:

1、逐位相加的时候要考虑进位

2、一般两个数相加,如:数1的位数为a, 数2的位数为b,则相加的结果位数可能为 max(a,b) 或 max(a,b) +1. 所以要注意相加结果首位可能是0.

3、用字符串表示数字的时候,是用字符表示数字的  0 --> '0' ,所以在相加计算的时候要将字符转换为对应的数字。

 

int _tmain(int argc, _TCHAR* argv[])
{
    char* number1 = "9999999";
    char* number2 = "9999999";
    char* result = BigNumberAddition(number1,number2);
    cout << result;
    free(result);

    return 0;

}

 

运行结果: