原题链接:蓝桥杯基础练习VIP-高精度加法
解题思路:
1. 用字符串数组来读入数字,用strlen可得知数组长度
2.使用数字的ACSII码将字符1转换为数字1
注意事项:
1.注意一下两个数组长度相等的情况吧,最高位可能有进位
参考代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int max(int a, int b){
if(a>=b) return a;
else return b;
}
int main() {
char ach[110];//字符数组用来读取输入,之后可以用strlen获取长度
char bch[110];
int a[110],lena;//a[0],b[0],c[0]是个位
int b[110],lenb;
int c[110],i;//i为数组c的长度,i等于数组a和数组b长度相比较,较大的那个值,i=max(lena,lenb)
int r=0;//r是记录进位的
scanf("%s",ach);
scanf("%s",bch);
lena=strlen(ach);
lenb=strlen(bch);
for (int i = 0; i <lena ; ++i) {//字符1的ASCII码是49,做数值运算时字符是用ASCII码计算,
// 因为49-48=1,所以可从字符转换为整型数字
a[lena-1-i]=ach[i]-48; //输入的字符是ach[]是按高位到低位,现在处理为从a[0]开始为个位;
// 否则若a[0]与b[0]为最高位,有进位就无法存储了
}
for (int j = 0; j <lenb ; ++j) {
b[lenb-1-j]=bch[j]-48;
}
for( i=0;i<max(lena,lenb);i++){
c[i]=(a[i]+b[i]+r)%10; //a与b的本位加上来自低位的进位对10求余就是本求和的值
r=(a[i]+b[i]+r)/10; //本位和没有求余时,若大于10,则r为1,有进位;反之为0,无进位
}
if(lena==lenb&&r==1) { //特殊情况,当输入的两个数字长度相同时,最高位可能会进位,r=1就输出,
// r为0说明没有进位,不输出(题目说数字没有前导0)
c[i]=r;
printf("%d",c[i]);
}
for (int l = max(lena,lenb)-1; l >=0 ; l--) {//c[0]是个位,所以反过来输出,先输出高位
printf("%d",c[l]);
}
return 0;
}0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复