【牛客题库整理】NC1 大数加法

题目

在这里插入图片描述

题解

C

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * 计算两个数之和
 * @param s string字符串 表示第一个整数
 * @param t string字符串 表示第二个整数
 * @return string字符串
 */
char* solve(char* s, char* t ) {
    // write code here
    int sLen = strlen(s);
    int tLen = strlen(t);
    int resultLen;
    
    if(sLen == 0)
        return t;
    if(tLen == 0)
        return s;
    //2个数字相加,和的位数最多为较长数字位数+1,因为是字符串,预留一个'\0'的位置,所有+2
    if(sLen > tLen)
        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)
    {
        //从后往前,取每位的数字,若较长数字位有效,但较短数字位无效,则较短数字位返回0
        int n1 = sPos >= 0 ? s[sPos--]-'0' : 0;
        int n2 = tPos >= 0 ? t[tPos--]-'0' : 0;
        sum = n1 + n2 + carry;
        if(sum >= 10)
        {
            carry = 1;
            result[resPos++] = sum%10+'0';
        }
        else
        {
            carry = 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;
}

知识点

1.sizeof和strlen的区别

https://blog.csdn.net/21aspnet/article/details/1539951
1)sizeof(…)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。

它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。

由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所占的空间,返回值跟对象、结构、数组所存储的内容没有关系

2)strlen(…)是函数,要在运行时才能计算。参数必须是字符型指针(char*)。当数组名作为参数传入时,实际上数组就退化成指针了。

它的功能是:返回字符串的长度

该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符NULL。返回的长度大小不包括NULL(’\0’)

2. a–和--a

以下例子摘自牛客C语言教程

#include <stdio.h>

int main()
{
   int c;
   int a = 10;
   c = a++; 
   printf("先赋值后运算:\n");
   printf("Line 1 - c 的值是 %d\n", c );
   printf("Line 2 - a 的值是 %d\n", a );
   a = 10;
   c = a--; 
   printf("Line 3 - c 的值是 %d\n", c );
   printf("Line 4 - a 的值是 %d\n", a );

   printf("先运算后赋值:\n");
   a = 10;
   c = ++a; 
   printf("Line 5 - c 的值是 %d\n", c );
   printf("Line 6 - a 的值是 %d\n", a );
   a = 10;
   c = --a; 
   printf("Line 7 - c 的值是 %d\n", c );
   printf("Line 8 - a 的值是 %d\n", a );

}

以上程序执行输出结果为:

先赋值后运算:
Line 1 - c 的值是 10
Line 2 - a 的值是 11
Line 3 - c 的值是 10
Line 4 - a 的值是 9
先运算后赋值:
Line 5 - c 的值是 11
Line 6 - a 的值是 11
Line 7 - c 的值是 9
Line 8 - a 的值是 9

3. A?B:C

若A为真,则B;若A为假,则C。
但有一点是值得注意的,那就是问号表达式的结合性,问号表达式是从右往左的运算方向
尤其是当问号表达式嵌套使用时得注意这个问题,例如
代码:
int a=1,b=2,c=3,d=4;
printf("%d",a<b?a:c<d?c:d);
正确结果是:1
因为先执行的是c<d?c:d,会返回c,然后执行a<b?a:c
因此得到的结果就是1

4. c-‘0’

将字符变成数字
字符‘0’对应的ASCII码是48,48对应的十六进制数就是0x30,通常我们在编程的时候,将字符转化为数字的时候经常要用到,比如要将‘8’转换为数字8,在语句中这样写就可以了,“ 8-‘0’”。

0&‘0’&“0”
0整型常量
‘0’字符常量
‘0’字符串常量

5. c+‘0’

讲数字变成字符
同理相反

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值