面试题17_2:实现两个大数相加(包含负数)

本题考查大数问题。大数一般用字符串或者数组表示。注意,strlen()函数返回的值是数组'\0'前元素的个数,并不包括'\0'。

C++版本

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;

void printNumber(char number[]){
    bool isBeginning0 = true;
    int nLength = strlen(number);
    for(int i = 0; i < nLength; i++){
        if(isBeginning0 && number[i] != '0')
            isBeginning0 = false;
        if(!isBeginning0)
            printf("%c", number[i]);
    }
    printf("\t");
}

// 实现两个大数相加,结果记入到a[]; flag标记哪一个是负数; 返回值有两个,1表示溢出,2表示结果为正数,3表示结果为负数
int addBigInt(char a[], char b[], int flag){
    int arraySize = strlen(a);
    int ans = 2;
    int nSum = 0;
    // 第n个进位
    int nTakeOver = 0;
    for(int i = arraySize-1; i>=0; i--){
        // 都是正数或者都是负数
        if(flag == 0 || flag == 3)
            nSum = (a[i]-'0') + (b[i]-'0') + nTakeOver;
        // a是负数
        else if(flag == 1){
            nSum = -(a[i]-'0') + (b[i]-'0') + nTakeOver;
        }
        // b是负数
        else if(flag == 2){
            nSum = (a[i]-'0') - (b[i]-'0') + nTakeOver;
        }
        // 如果产生进位
        if(nSum > 9){
            // 如果是首位产生了进位,那么溢出
            if(i == 0)
                ans = 1;
            else{
                a[i] = '0' + nSum - 10;
                nTakeOver = 1;
            }
        }
        // 如果产生借位
        else if(nSum < 0){
            // 如果是首位产生了借位,那么是负数
            if(i == 0)
                ans = 3;
            else{
                a[i] = '0' + 10 + nSum;
                nTakeOver = -1;
            }
        }
        // 如果没有产生进位,也没有借位,这里不会break;
        else{
            a[i] = '0' + nSum;
            nTakeOver = 0;
        }
    }
    // 如果都是负数,则结果也是负数
    if(flag == 3)
        return 3;
    return ans;
}

int main()
{
    char a[8] = {'1','6','3','5','3','5','4','\0'};
    char b[8] = {'0','0','4','3','2','6','3','\0'};
    cout<<strlen(a)<<endl;
    if(addBigInt(a, b, 3) == 3)
        printNumber(a);
    return 0;
}

posted @ 2020-07-22 16:54  程序员曾奈斯  阅读(369)  评论(0编辑  收藏  举报