百练2738:实数加法题解

2738:实数加法

总时间限制: 
1000ms 
内存限制: 
65536kB
描述

求两个实数相加的和。

题目中输入输出里出现的浮点数都有如下的形式:
P1P2...Pi.Q1Q2...Qj。对于整数部分,P1P2...Pi是一个非负整数且当整数部分不为0时,P1不等于0;对于小数部分,Qj不等于0。

输入
2行,每行是一个加数。每个加数的长度不超过100。
输出
一行,即相应的和。输出保证一定是一个小数部分不为0的实数。
样例输入
0.111111111111111111111111111111
0.111111111111111111111111111111
样例输出
0.222222222222222222222222222222

  • 查看 
  • 提交 
  • 统计 
  • 提示 
  • 提问
    • 代码:
    • #include<cstdio>
      #include<cstring>
      const int LEN = 100;
      char num1[LEN + 10],num2[LEN + 10];
      int aint[LEN],aflo[LEN],int1[LEN],int2[LEN],flo1[LEN],flo2[LEN];
      int main() {
         	scanf("%s",num1);
          scanf("%s",num2);
          int len1 = strlen(num1),len2 = strlen(num2),pos1,pos2,id1 = 0,id2 = 0;
          pos1 = strchr(num1,'.') - num1, pos2 = strchr(num2,'.') - num2;
          for(int i = pos1 + 1; i < len1; i++){
              flo1[id1++] = num1[i] - '0';
          }
          for(int i = pos2 + 1; i < len2; i++){
              flo2[id2++] = num2[i] - '0';
          }
          id1 = id1 > id2 ? id1 - 1 : id2 - 1;
          for(int i = id1; i > 0; i--){
              aflo[i] += flo1[i] + flo2[i];
              if(aflo[i] >= 10){
                  aflo[i] -= 10;
                  aflo[i - 1]++;
              }
          }
          aflo[0] += flo1[0] + flo2[0];
          if(aflo[0] >= 10){
              aflo[0] -= 10;
              aint[0] ++;
          }
          id1 = id2 = 0;
          for(int i = pos1 - 1; i >= 0; i--){
              int1[id1++] = num1[i] - '0';
          }
          for(int i = pos2 - 1; i >= 0; i--){
              int2[id2++] = num2[i] - '0';
          }
          id1 = id1 > id2 ? id1 : id2;
          for(int i = 0; i < id1; i++){
              aint[i] += int1[i] + int2[i];
              if(aint[i] >= 10){
                  aint[i]-= 10;
                  aint[i+1]++;
              }
          }
          for(id2 = id1; aint[id2] == 0 && id2 >= 0;id2--);
          for(int i = id2; i >= 0; i--) printf("%d",aint[i]);
      	if(id2 < 0) putchar('0');
          putchar('.');
          for(id1 = LEN - 1; aflo[id1] == 0 && id1 >= 0;id1--);
          for(int i = 0; i <= id1; i++) printf("%d",aflo[i]);
          putchar('\n');
          return 0;  
      }


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值