题目链接
https://www.dotcpp.com/oj/problem1517.html
解题思路
分别整数部分和小数部分计算。
整数部分:高精度大整数相加,注意小数部分来的进位。
小数部分:与整数部分一样,要从低位加起,注意保存给个位的进位。
对于整数部分,我们依旧采取逆置字符串的方式;
对于小数部分,我们不可以逆置字符串,因为逆置字符串之后,小数部分实现了低位对齐相加,这样与小数部分的加法规则不符。因此,我们正序保存小数部分,倒序相加,对个位的进位保存在数组的第一个元素位置即可。
AC代码
#include<bits/stdc++.h> using namespace std; const int N=110; char s1[N],s2[N]; int num1,num2,num3,num4; int maxx1,maxx2; int len1,len2; int tmp[N]; int xiao_a[N],zheng_a[N]; int xiao_b[N],zheng_b[N]; int xiao_c[N],zheng_c[N]; int main(){ cin>>s1+1>>s2+1; len1=strlen(s1+1); len2=strlen(s2+1); //把第一个加数的整数部分分割出来,并逆置保存 for(int i=1;i<=len1;i++){ if(s1[i]=='.') break; tmp[++num1]=s1[i]-'0';//临时数组,正序保存了整数部分 } for(int i=1;i<=num1;i++) zheng_a[num1-i+1]=tmp[i]; //把第二个加数的整数部分分割出来,并逆置保存 for(int i=1;i<=len2;i++){ if(s2[i]=='.') break; tmp[++num2]=s2[i]-'0'; } for(int i=1;i<=num2;i++) zheng_b[num2-i+1]=tmp[i]; //第一个数小数部分的保存 for(int i=num1+2;i<=len1;i++) xiao_a[++num3]=s1[i]-'0'; //第二个数小数部分的保存 for(int i=num2+2;i<=len2;i++) xiao_b[++num4]=s2[i]-'0'; //小数部分相加 maxx1=max(num3,num4); for(int i=maxx1;i>=1;i--){ xiao_c[i]+=xiao_a[i]+xiao_b[i]; xiao_c[i-1]=xiao_c[i]/10; xiao_c[i]%=10; } //整数部分相加 zheng_c[1]=xiao_c[0];//先保存上小数部分的进位 maxx2=max(num1,num2); for(int i=1;i<=maxx2;i++){ zheng_c[i]+=zheng_a[i]+zheng_b[i]; zheng_c[i+1]=zheng_c[i]/10; zheng_c[i]%=10; } if(zheng_c[maxx2+1]!=0) maxx2++;//勿忘 //输出整数部分 for(int i=maxx2;i>=1;i--) cout<<zheng_c[i]; if(maxx1!=0){//判断是否存在小数部分,不存在就不进行输出,存在时先输出小数点再输出小数部分 cout<<'.'; for(int i=1;i<=maxx1;i++) cout<<xiao_c[i]; } return 0; }
总结
顺着的写就行,只要掌握熟练了大整数相加,这个就没什么问题了