题解 | #浮点数加法#
浮点数加法
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',将两个要相加的部分位数搞成相同的 整数不需要这样,整数两个部分直接进行分别取反取整再相加即可。
查看25道真题和解析
三奇智元机器人科技有限公司公司福利 50人发布