【HDU1002】C++ 千位数以内的大数加法

编译环境:MinGW5.1.6

1.大数加法函数实现思路

1)函数输入:字符串形式的数字a和b

2)翻转字符串a和b,这样可以使两个数字的末位对其,利于逐位加法运算

3)将a和b中各位相加,和赋值到字符串sum对应位中,如果有进位则sum中的下一位自增1

4)将字符串a、b、sum翻转,a和b会翻转为它们原来的样子,sum即数字a与b的和

5)去掉sum前面多余的0

6)函数输出:字符串形式的数字sum

2.函数体(包括翻转字符串用的函数Reverse和加法函数Add)

///翻转一个字符串
/*
 *@param char s[] 被翻转的字符串
 *@return char* 翻转后的字符串
 */
char* Reverse(char s[])
{
    int i = 0, j = strlen(s) - 1;
    char temp;
    while(i < strlen(s) / 2)
    {
        temp = s[i];
        s[i] = s[j];
        s[j] = temp;
        i++;
        j--;
    }
    return s;
}

///两个字符串表示的大数的加法运算
/*
 *@param char a[] 加数1
 *@param char b[] 加数2
 *@return char* 和
 */
char* Add(char a[], char b[])
{
    int i, j;
    char* sum = new char[1001];

    //翻转数组a和b
    Reverse(a);
    Reverse(b);

    //两数组共有的位
    sum[0] = '0';
    for(i = 0; i < strlen(a) && i < strlen(b); i++)
    {
        sum[i + 1] = '0';
        sum[i + 2] = 0;

        sum[i] += (a[i] - '0') + (b[i] - '0');
        if(sum[i] > '9')
        {
            sum[i] -= 10;
            sum[i + 1] ++;
        }
    }

    //如果a的位数比b多,考虑a的高位
    if(strlen(a) > strlen(b))
    {
        for(i = strlen(b); i < strlen(a); i++)
        {
            sum[i + 1] = '0';
            sum[i + 2] = 0;

            sum[i] += (a[i] - '0');
            if(sum[i] > '9')
            {
                sum[i] -= 10;
                sum[i + 1] ++;
            }
        }
    }
    //如果b的位数比a多,考虑b的高位
    else if(strlen(b) > strlen(a))
    {
        for(i = strlen(a); i < strlen(b); i++)
        {
            sum[i + 1] = '0';
            sum[i + 2] = 0;

            sum[i] += (b[i] - '0');
            if(sum[i] > '9')
            {
                sum[i] -= 10;
                sum[i + 1] ++;
            }
        }
    }

    //翻转数组sum
    Reverse(sum);
    
    //复原数组a和b
    Reverse(a);
    Reverse(b);
    
    //去掉前面多余的0
    while(*sum == '0')
    {
        sum += 1;
    }
    return sum;
}

3.函数调用

输入迭代次数times。输入两个数a和b,程序返回a与b的和,迭代times次。

int main()
{
    char a[1000], b[1000];

    //指定循环次数
    int counter, times;
    cin >> times;
    for(counter = 1; counter <= times; counter ++)
    {
        //输入两个数字并求和
        cin >> a >> b;
        
        cout << "Case " << counter << ':' << endl;
        cout << a << " + " << b << " = " << Add(a, b) << endl;
        
        if(counter != times)
        {
            cout << endl;
        }
    }

    return 0;
}

4.运行结果

【HDU1002】C++ 千位数以内的大数加法

END

你可能感兴趣的:(HDU1002)