牛客-C语言解法-大数加法

 题目链接:

大数加法_牛客题霸_牛客网 (nowcoder.com)

题目简介:

描述

以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回。

数据范围:s.length,t.length≤100000,字符串仅由'0'~‘9’构成

要求:时间复杂度 O(n)

题目解法:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

/*
 *BM86 大数加法
描述
    以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回。

数据范围: s.length,t.length≤100000,字符串仅由'0'~‘9’构成
要求:时间复杂度 O(n) 
*/

char* solve(char* s, char* t ) {
    // write code here
    int iSCount = 0, iTCount = 0, iResCount = 0;    //声明s\t\res的长度变量
    char *pcTmp, *pcRes;
    // char pcRes[4];       //调试代码
    char iOvFlag = 0;       //进位标志

    pcTmp = s;              //计算得到s的长度
    while(*pcTmp++ != '\0'){
        iSCount++;
    }

    pcTmp = t;              //计算得到t的长度
    while(*pcTmp++ != '\0'){ 
        iTCount++;
    }

    iResCount = (iSCount > iTCount) ? iSCount+2 : iTCount+2;    //res长度取max(s,t)的长度+2。一个给结束符,一个预留给进位
    pcRes = (char *)malloc(sizeof(char)*(iResCount));      //返回结果动态申请内存
    pcRes[0]='0', pcRes[iResCount-1]='\0';                  //设置进位为'0',以及结束符
    iResCount -= 2;                                         //xxCount都用做索引,因此需要-1,
    iTCount -= 1;
    iSCount -= 1;

    while(iSCount >= 0 || iTCount >= 0){                
        if(iSCount >= 0 && iTCount >= 0){           //1、当s\t均不为空
            if(s[iSCount]-'0'+t[iTCount]-'0'+iOvFlag >= 10){    //s\t的右对齐的对应位相加再加上进位,溢出则-10后赋值并将进位标志置位
                pcRes[iResCount] = s[iSCount]-'0'+t[iTCount]-'0'+iOvFlag-10+'0';
                iOvFlag = 1;
            }else{                                              //不溢出则直接赋值,并将进位标志清空
                pcRes[iResCount] = s[iSCount]-'0'+t[iTCount]-'0'+iOvFlag+'0';
                iOvFlag = 0;
            }
        }else if(iSCount >= 0 && iTCount < 0){
            if(s[iSCount]-'0'+iOvFlag >= 10){
                pcRes[iResCount] = s[iSCount]-'0'+iOvFlag-10+'0';
                iOvFlag = 1;
            }else{
                pcRes[iResCount] = s[iSCount]-'0'+iOvFlag+'0';
                iOvFlag = 0;
            }
        }else if(iSCount < 0 && iTCount >= 0){
            if(t[iTCount]-'0'+iOvFlag >= 10){
                pcRes[iResCount] = t[iTCount]-'0'+iOvFlag-10+'0';
                iOvFlag = 1;
            }else{
                pcRes[iResCount] = t[iTCount]-'0'+iOvFlag+'0';
                iOvFlag = 0;
            }
        }    
        iTCount--;  //向左移位
        iSCount--;
        iResCount--;
    }
    if(iOvFlag==1){ //退出循环,此时判断进位标志,如果为1则将pcRes的iResCount(0位)置1。
        pcRes[iResCount] += iOvFlag;
    }

    if(pcRes[0] == '1') //根据是否有溢出位返回结果
        return pcRes;
    else
        return pcRes+1;
}


/**************************end******************************************/

int main ()
{
    char *s1 = "114514";
    char *s2 = "";
    char *ret = solve(s1, s2);
    printf("\r\nret: %s", ret);
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值