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


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

    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("	");
    }
    
    // 实现两个大数相加,结果记入到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',''};
        char b[8] = {'0','0','4','3','2','6','3',''};
        cout<<strlen(a)<<endl;
        if(addBigInt(a, b, 3) == 3)
            printNumber(a);
        return 0;
    }
    
    
  • 相关阅读:
    GB2312 字符集
    Excel导入
    Excel导出
    解决文件下载在火狐浏览器出现中文文件名乱码的方法
    Struts2将图片输出到页面
    jsp页面中日期的格式化
    java正则表达式笔记
    利用git将项目上传到github
    Java中枚举的写法和用法
    自定义JQuery插件
  • 原文地址:https://www.cnblogs.com/flyingrun/p/13361800.html
Copyright © 2020-2023  润新知