题解 | #浮点数加法#

浮点数加法

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',将两个要相加的部分位数搞成相同的 整数不需要这样,整数两个部分直接进行分别取反取整再相加即可。

全部评论

相关推荐

不愿透露姓名的神秘牛友
10-12 10:48
已编辑
秋招之苟:邻居家老哥19届双2硕大厂开发offer拿遍了,前几天向他请教秋招,他给我看他当年的简历,0实习实验室项目技术栈跟开发基本不沾边😂,我跟他说这个放在现在中厂简历都过不了
点赞 评论 收藏
分享
死在JAVA的王小美:哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈,我也是,让我免了一轮,但是硬气拒绝了
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务