1501 - 浮点数加法

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 32 MB

求2个浮点数相加的和

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

题目输入

对于每组案例,第1行是测试数据的组数n,每组测试数据占2行,分别是两个加数。

每组测试数据之间有一个空行,每行数据不超过100个字符

题目输出

每组案例是n行,每组测试数据有一行输出是相应的和。

输出保证一定是一个小数部分不为0的浮点数

输入/输出样例

输入格式

2
3.756
90.564

4543.5435
43.25

输出格式

94.32
4586.7935

C语言解答

#include "string.h"
#include "math.h"
int main(int argc, char* argv[])
{
	int n,i;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		char a[101],b[101],*p;
		scanf("%s%s",a,b);
		int j,k,la,lb,coua,coub,s,c,ln,ca,cb;
		int ina[101],inb[101],sum[101];
		la=strlen(a);
		lb=strlen(b);
		p=strchr(a,'.');
		if (NULL==p) coua=0;
		else 
		 coua=la-(p-a)-1;
		p=strchr(b,'.');
		if (NULL==p) coub=0;
		else 
		 coub=lb-(p-b)-1;		
		c=coua>coub?coua:coub;
		ln=(la-coua)>(lb-coub)?la-coua:lb-coub;
		ca=0,cb=0;
		for(j=0;j<c;j++)	
		{			
			if(coua>coub)
			{
				inb[j]=0;
				ina[j]=a[la-j-1]-'0';
				coub++;
				cb++;
			}
			else if(coua<coub)
			{
				ina[j]=0;
				inb[j]=b[lb-j-1]-'0';
				coua++;
				ca++;
			}
			else
			{
				ina[j]=a[la-j-1+ca]-'0';
				inb[j]=b[lb-j-1+cb]-'0';
			}
		}
		ina[j]=-2,inb[j]=-2;
		for(k=j+1;k<ln+c;k++)
		{
			if(k>=la+ca) 
			{
				ina[k]=0;
				inb[k]=b[lb-k-1+cb]-'0';
			}
			else if(k>=lb+cb) 
			{
				inb[k]=0;
				ina[k]=a[la-k-1+ca]-'0';
			}
			else
			{
				ina[k]=a[la-k-1+ca]-'0';
				inb[k]=b[lb-k-1+cb]-'0';
			}
		}
	    s=0;
		for(j=0;j<ln+c;j++)
		{
			if(ina[j]!=-2&&j<ln+c-1)	
			{
				sum[j]=(s+ina[j]+inb[j])%10;
				s=(s+ina[j]+inb[j])/10;
			}
			else if(ina[j]!=-2&&j==ln+c-1)
				sum[j]=s+ina[j]+inb[j];
			else
				sum[j]=-2;
		}		
		for(j=0;j<c;j++)
		{
			if(sum[j]!=0) break;
		}
		for(k=ln+c-1;k>=j;k--)
		{
			if(ina[k]==-2&&j<c)
				printf(".");
			else if(ina[k]==-2&&j>=c)
				continue;
			else
				printf("%d",sum[k]);
		}
		printf("\n");
		if(i!=n-1)
			gets(p);
	}
	return 0;

}

C++解答

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
                      
void add_zero(string &a, string &b)
{
    int a_sub_len = int(a.find('.'));
    int b_sub_len = int(b.find('.'));
    int &sub_max = a_sub_len > b_sub_len ? a_sub_len : b_sub_len;
    string &sub_min = a_sub_len < b_sub_len ? a : b;
    while(int(sub_min.find('.')) != sub_max)
    {
        sub_min.insert(sub_min.begin(), '0');
    }
    int a_len = a.length();
    int b_len = b.length();
    int max = a_len > b_len ? a_len : b_len;
    string &min = a.length() < b.length() ? a : b;
    while(min.length() != max)
    {
        min += '0';
    }
}
                      
string float_add(string &a, string &b)
{
    add_zero(a, b);
    reverse(a.begin(), a.end());
    reverse(b.begin(), b.end());
    int len = a.length(), carry = 0;
    string result;
    for(int i = 0; i < len; i++)
    {
        if(a[i] == '.')   result += '.';
        else
        {
          result += char(((a[i] + b[i] - 96) + carry) % 10 + 48);
          carry = (a[i] + b[i] - 96 + carry) / 10;
        }
    }
    if(carry > 0)
    {
        result += char(carry + 48);
    }
                    
    while(result[0] == '0' && result[1] != '.')
    {
        result.erase(result.begin());
    }
    while(*(result.end() - 1) == '0'  && *(result.end() - 2) != '.')
    {
        result.erase(result.end() - 1);
    }
    reverse(result.begin(), result.end());
    return result;
}
                     
int main()
{
    int n;
    string a, b;
    while(cin >> n) 
    {
        while(n--)
        {
            cin >> a >> b;
            cout << float_add(a, b) << endl;
        }
    }       
    return 0;
}

Java解答



import java.math.BigDecimal;
import java.util.Scanner;

public class Main{
   private static Scanner s = new Scanner(System.in) ;
   
   public static void main(String[] args) {
	  int n = s.nextInt() ;
	  
	  for (int i = 0; i < n; i++) {
		  BigDecimal x = s.nextBigDecimal() ;
		  BigDecimal y = s.nextBigDecimal() ;
		  BigDecimal result = x.add(y) ;
		  
		  result = result.stripTrailingZeros() ;
		  System.out.println(result);
	  }
   }
}