题目描述
高精度加法,相当于 a+b problem,不用考虑负数。
输入格式
分两行输入。a,b≤10500a,b≤10500。
输出格式
输出只有一行,代表 a+ba+b 的值。
输入输出样例
输入 #1
1 1
输出 #1
2
输入 #2
1001 9099
输出 #2
10100
题目分析:
由于数字的位数最大时500位,这时即使longlong也无法存储这样的数字,所以,我们需要使用高精度去解决它。
1.用字符串数%s将数字读入字符串数组:
①为什么要用字符串数组?
因为你并不知道两个数字的最大位数是几,进行求和的时候会导致越界
其实可以使用int,但是就数据的输入,char更方便,下一步进行个位对齐,就比较方便
2.个位对齐:
小学我们都知道,列竖式就要对齐,进行运算,大于等于10就进位,这是,我们可以把个位放在数组开始的地方,把高位放在数组末尾,实现下面这样的效果:(当然这是一个思路,你只要实现每一位对齐就行)
3.求和运算:
进行求和的时候,要考虑,这最终求和之后的数字是个几位数?由于这是求和,最多就只是比原来最多的位数多一位,所有我们可以在求和完成后进行一次专门针对位数的判断,也就是对最高位的下一个数组元素判断是否大于零,如果大于零,输出的时候就得多输出一位。
实现求和,将对应位的两个数字加起来,然后判断是否大于等于10,如果大于,那么给下一位+1,如果不大于,就直接给用来输出最终答案的数组对应位置+1,最后逆着输出就行了
代码:
#include <stdio.h>
#include <string.h>
int num1[501],num2[501],num[501];
char arr1[501],arr2[501];
int max(int x,int y) {
if(x>y) {
return x;
} else {
return y;
}
}
int main() {
scanf("%s",arr1);
scanf("%s",arr2);
int len1=strlen(arr1);
int len2=strlen(arr2);
int len=max(len1,len2);
for(int i=0; i<len; i++) {
num1[i]=0;
num2[i]=0;
}
for(int i=0,t=len1-1; i<len1; i++,t--) { //将每一项进行转化
num1[t]=arr1[i]-48;
}
for(int i=0,t=len2-1; i<len2; i++,t--) {
num2[t]=arr2[i]-48;
}
int sum=0;
for(int i=0; i<len; i++) { //进行模拟求和
sum=num1[i]+num2[i];
if(sum>9) {
num[i]=sum%10;
num1[i+1]++;
sum=0;
} else {
num[i]=sum;
sum=0;
}
}
if(num1[len]>0) { //对首位进行判断
num[len]++;
for(int i=len; i>=0; i--) {
printf("%d",num[i]);
}
} else {
for(int i=len-1; i>=0; i--) {
printf("%d",num[i]);
}
}
return 0;
}