题解 | #浮点数加法#
浮点数加法
https://www.nowcoder.com/practice/ddec753f446e4ba4944e35378ba635c8
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; char str[1000]; string addint(char *a,char *b,int h){ //对整数部分的处理 int n1=strlen(a); int n2=strlen(b); char *begin_char=a;//多 char *end_char=b;//少 if (n2>n1)//将最大的值给n1 将begin_int作为起始的 { swap(n1,n2); begin_char=b; end_char=a; } int begin_int[1000]={0}; int end_int[1000]={0}; for (int i = 0; i < n1; i++) { begin_int[i]=begin_char[n1-1-i]-'0'; } for (int i = 0; i < n2; i++) { end_int[i]=end_char[n2-1-i]-'0'; } int sum_int[n1]; memset(sum_int,0,sizeof(sum_int)); int rest=h; for (int i = 0; i <=n1 ; i++) { sum_int[i]=(begin_int[i]+end_int[i]+rest)%10; rest=(begin_int[i]+end_int[i]+rest)/10; } string tempint; int rest_on=0;//判断最高位的数是否为零 for (int i = n1; i >=0; i--) { if (sum_int[i])//maxn位上不是0时就将 rest_on=1; if(rest_on==1) tempint+=sum_int[i]+'0';//这里将从数组的最高位上的数组装到字符串从左到右 } if(tempint.size()); else tempint='0'; return tempint; } int main(){ char buff1[1000]; char buff2[1000]; while(scanf("%s", buff1) != EOF) { scanf("%s", buff2); //这里将char数组中的某个数进行将某个值换成\n则就是将其分开了 首地址指向首个字母和换行符之前有效 for(int i = 0; ; i ++) if(buff1[i] == '.' || buff1[i] == '\0') { buff1[i] = '\0'; break; } for(int i = 0; ; i ++) if(buff2[i] == '.' || buff2[i] == '\0') { buff2[i] = '\0'; break; } char * int1 = buff1; char * dec1 = buff1 + strlen(int1) + 1;//这里加上了长度又是指向了换行符之后的有效地址 char * int2 = buff2; char * dec2 = buff2 + strlen(int2) + 1; // printf("%s.%s %s.%s\n", int1, dec1, int2, dec2); //对小数部分的处理 int n1=strlen(dec1); int n2=strlen(dec2); char *begin_char=dec1;//多 char *end_char=dec2;//少 if (n2>n1)//将最大的值给n1 将begin_int作为起始的 { swap(n1,n2); begin_char=dec2;//将最大的值都给n1 begin位置 end_char=dec1; } for(int i=n2;i<n1;i++){ end_char[i]='0'; } // puts(end_char); int begin_int[1000]={0}; int end_int[1000]={0}; for (int i = 0; i < n1; i++) { begin_int[i]=begin_char[n1-1-i]-'0'; // cout<<begin_int[i]<<" "; } // cout<<endl; for (int i = 0; i < n1; i++) { end_int[i]=end_char[n1-1-i]-'0'; // cout<<end_int[i]<<" "; } int rest=0; int sum_int[n1]; memset(sum_int,0,sizeof(sum_int)); // cout<<endl; for (int i = 0; i <=n1 ; i++) { sum_int[i]=(begin_int[i]+end_int[i]+rest)%10; rest=(begin_int[i]+end_int[i]+rest)/10; // cout<<sum_int[i]<<" "; } // cout<<endl; int pointToint=sum_int[n1]; string temp; for (int i = n1-1; i >=0; i--) { temp+=sum_int[i]+'0'; } if(temp.size()); else temp='0'; string stringint=addint(int1,int2,pointToint); cout<<stringint<<"."<<temp<<endl; } }
最后进行输出的时候中间是英文的点 不是冒号 (不要像我一样犯这种超级低级的错误!!)
然后就是解题时 将小数的进位给整数 整数的进位显示出来
两个部分相加的大体思路一样 唯一不同就是小数部分需要左对齐 这时可以将小数位数少的的char型数组后边添加'0',将两个要相加的部分位数搞成相同的 整数不需要这样,整数两个部分直接进行分别取反取整再相加即可。