给定两个字符串形式的非负整数 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;
}