0
点赞
收藏
分享

微信扫一扫

C语言习题:给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式储存。

小月亮06 2022-01-20 阅读 52

给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式储存。

数字字符串相加
①以个位对齐相加 个位是在字符串的末尾
num1数字个位的下标:len1 = strlen(num1)-1
num2数字个位的下标:len2 = strlen(num2)-1

②我们要从个位开始往回逐个字符相加 加几次?
看那个数字字符串长

③可以统一的认为每个数字位相加都有进位
只不过有时进位是0 有时进位是1

#include <stdio.h>

int main()
{
    unsigned char str1[20]={0};
	unsigned char str2[20]={0};
	unsigned char num[20]={0};//存放结果
	int i;
	printf("str1=");
	//fgets(str1,20,stdin);//fgets()会在末尾多获取一个 '\n'
    scanf("%s",str1);
	printf("str2=");
	//fgets(str2,20,stdin);
    scanf("%s",str2);

    //参考denmo
    int len1 = strlen(str1) - 1;
    int len2 = strlen(str2) - 1;             //得到两个字符串的末尾成员下标
    int Adv_bit = 0;                         //记录进位 0/1

    //“123” + “898” == "1201"
    for (i = 0; i <= (len1 > len2 ? len1 : len2); i++)
    {
        num[i] = str1[len1] + str2[len2] - 96 + Adv_bit; // 得到纯数值记得加上进位
        Adv_bit = num[i] / 10;                           //得到本轮加法的进位
        num[i] = num[i] % 10 + '0';                      //得到当前的位的数值再加上'0' -- 数字字符

        len1--;
        len2--;

        //处理len1和len2不相等的情况
        if (len1 == -1) //len1短
        {
            len1 = 0;
            str1[0] = '0'; //如果str1已经算完了 它比较短  可以固定len1 为0
        }
        if (len2 == -1) //len2短
        {
            len2 = 0;
            str2[0] = '0'; //如果str1已经算完了 它比较短  可以固定len1 为0
        }
    }


    //处理好多进一位的情况
    if (Adv_bit == 1)
    {
        num[i]     = '1'; //因为上面循环出来 i会多+1
        num[i + 1] = '\0';
    }
    else
        num[i] = '\0';


    //逆序
    len1 = strlen(num);
    for (i = 0; i < len1 / 2; i++)
    {
        num[i]            = num[len1 - i - 1] + num[i];
        num[len1 - i - 1] = num[i] - num[len1 - i - 1];
        num[i]            = num[i] - num[len1 - i - 1];
    }

    printf("计算结果:%s\n", num);
    
    return 0;
}
举报

相关推荐

0 条评论