这是蓝桥杯练习系统上的-算法提高-大数加法,纯C语言,大一就能学会
说一下我的解题思路:
首先用字符串代表输入”大数“,这边可以直接用scanf输入;
然后比较两个字符串(数)的长度,我这里是保证s1的长度<s2的长度,即如果s1比s2长,则交换顺序,比较长度是为了方便后面对齐;
将两个字符串倒序储存在另外两个字符串str1,str2中(加法从个位开始);
前面说过,要对齐,我们已知str1是短字符串(小的数),直接将str1后面的长度赋值为0,注意,这里是字符‘0’;
接着开始做加法运算:将结果放在一个整型数组中(数组ans已赋初值0);逐位相加,考虑进位,如果相加的数>9,则减10;下一位存在的话,下一位加1,如果下一位不存在,我们可以在最开始插旗flag=0,令这个flag=1,最后输出1;比如1+9,加出来是个两位数,(可以保证如果加出来的位数增加了前面一定从1开始),则先输出1;
最后将数组ans倒序输出;
#include <stdio.h>
#include <string.h>
#define N 2048
int main() {
char s1[N], s2[N], str1[N], str2[N], t[N];
int ans[N] = {0};//结果
int i, j, len1, len2, flag = 0;
scanf("%s %s", s1, s2);
if (strlen(s1) > strlen(s2)) { //s1为短,s2为长
strcpy(t, s1);
strcpy(s1, s2);
strcpy(s2, t);
}
len1 = strlen(s1);//计算长度
len2 = strlen(s2);
j = 0;
for (i = len1 - 1; i >= 0; i--) { //倒序
str1[j++] = s1[i];
}
// str1[j] = '\0';
j = 0;
for (i = len2 - 1; i >= 0; i--) { //倒序
str2[j++] = s2[i];
}
str2[j] = '\0';
for (i = len1; i < len2; i++) { //空缺位置赋0(对齐)
str1[i] = '0';
}
str1[i] = '\0';
for (i = 0; i < len2; i++) {
ans[i] += (str1[i] + str2[i] - '0' - '0');
if (ans[i] > 9) {
ans[i] -= 10;
if (i + 1 < len2) {
ans[i + 1] += 1;
} else if (i + 1 == len2)
flag = 1;
}
}
if (flag == 1)
printf("1");
for (i = len2 - 1; i >= 0; i--)
printf("%d", ans[i]);
return 0;
}
最后奉上测评正确截图:
