大数加法

该代码实现了一个函数,以字符串形式读入两个数字并计算它们的和,返回结果也是一个字符串。函数首先确定结果的位数,然后从个位开始逐位相加,处理进位情况,最终得到和的字符串并进行反转。时间复杂度要求为O(n)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

char* solve(char* s, char* t ) 
{
    //数字位数
    int sLen = strlen(s);
    int tLen = strlen(t);
    int resultLen;
    
    if(sLen == 0) //位数为零则直接返回
        return t;
    if(tLen == 0)
        return s;

    //运算结果的位数
    if(sLen > tLen)  //2个数字相加,和的位数最多为较长数字位数+1,因为是字符串,预留一个'\0'的位置,所有+2
        resultLen = sLen+2;
    else
        resultLen = tLen+2;

    //char *result = (char *)malloc(sizeof(char)*resultLen); 申请空间
    char *result = (char *)calloc(resultLen, sizeof(char));

    int sPos = sLen-1;//求和从最后一位开始(个位)
    int tPos = tLen-1;

    int resPos = 0;//记录和的字符串当前位置
    int carry = 0;//进位
    int sum = 0;//求和

    int i, j;//翻转字符串
    
    while(sPos >= 0 || tPos >=0 || carry >0) //...或进位大于1时
    {
        //从后往前,取每位的数字,若较长数字位有效,但较短数字位无效,则较短数字位返回0
        int n1 = ( sPos >= 0 ? s[sPos--]-'0' : 0 ); //每位上 有数写数,无数写0
        int n2 = ( tPos >= 0 ? t[tPos--]-'0' : 0 );
        sum = n1 + n2 + carry;// 求和加上进位运算

        if(sum >= 10) //每位求和结果 有进位时
        {
            carry = 1; //进位置1
            result[resPos++] = sum%10+'0'; //该位数字
        }
        else//无进位时
        {
            carry = 0; //进位置0
            result[resPos++] = sum+'0';
        }
    }
    
    //s=1,t=99时,result=001,需原地翻转字符串为100
    for(i = 0, j = resPos-1; i < j; i++, j--)
    {
        char tmp = result[i];
        result[i] = result[j];
        result[j] = tmp; 
    }
        
    return result;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值