题目描述
给定两个字符串形式的非负整数a,ba,b ,计算它们的和。
此处a,ba,b的数的位数不超过1000位\
输入描述
对于第一行,给出一个非负整数aa.
对于第二行,给出一个非负整数bb
输出描述
给出对应a+b的结果
测试样例
输入数据 1
1234
2
Copy
输出数据 1
1236
我的一个想法仅仅是用利用字符转数字进行加法运算,所以构成了以下的代码
#include<stdio.h>
int main(void)
{
int count1=0,count2=0,c=0,d=0;
char a[1001] ,b[1001];
scanf("%s", a);
scanf("%s", b);
for(int i=0;a[i]!='\0';i++)
{
c=a[i]-'0';
count1=c+count1*10;
}
for(int j=0;b[j]!='\0';j++)
{
d=b[j]-'0';
count2=d+count2*10;
}
printf("%d",count1+count2);
return 0;
}
但是题目要求要达到1000位,仅仅用字符串转int是不可靠的,当位数达到整形无法承受的位数的时候,就得不到运算的结果,所以我在学长的帮助下,查找资料,找到以下进行高精度加法的方法
#include<stdio.h>
static const int len=1001
int a[len], b[len], c[len];
void clear(int a[])//清空数组
{
for (int i = 0; i < LEN; ++i)
a[i] = 0;
}
// 以字符串的形式读入数据 转成int[]进行存储
void read(int a[]) {
// 此处LEN+1的原因是%s读入数据时会在读入所有数据之后末尾用'\0'表示
static char s[LEN + 1];
scanf("%s", s);
// 写入int[]前清空数组内之前的数据
clear(a);
// 通过strlen获取字符数组内的长度
int len = strlen(s);
// 此处减'0'的原因是因为字符转数字类型的时候通过此方法转换
// for循环也就是遍历每一位进行转换
for (int i = 0; i < len; ++i)
a[len - i - 1] = s[i] - '0';
}
//输出函数
void print(int a[]) {
int i;
// 因为我们每次输入时都将数组内的所有位赋值0
// 此处的for循环也就是想将i放到他有效位的个位
for (i = LEN - 1; i >= 1; --i)
if (a[i] != 0) break;
// 将int类型转char输出 也就是+'0'
for (; i >= 0; --i) putchar(a[i] + '0');
putchar('\n');
}
//加法函数(竖式加法)
void add(int a[], int b[], int c[]) {
//清空结果数组
clear(c);
for (int i = 0; i < LEN - 1; ++i) {
// 相加(此处用的是+= 是考虑到后面的进位方便)
c[i] += a[i] + b[i];
// 判断是否需要进位
if (c[i] >= 10) {
// 进位
c[i + 1] += 1;
c[i] -= 10;
}
}
}
int main() {
// 读取数字A
read(a);
// 读取数字B
read(b);
// A+B
add(a, b, c);
// 调用输出函数输出
print(c);
return 0;
}