【九度OJ】题目1137:浮点数加法 解题报告

【九度OJ】题目1137:浮点数加法 解题报告

标签(空格分隔): 九度OJ


原题地址:http://ac.jobdu.com/problem.php?pid=1137

题目描述:

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

输入:

对于每组案例,第1行是测试数据的组数n,每组测试数据占2行,分别是两个加数。
每组测试数据之间有一个空行,每行数据不超过100个字符

输出:

每组案例是n行,每组测试数据有一行输出是相应的和。
输出保证一定是一个小数部分不为0的浮点数

样例输入:

2
0.111111111111111111111111111111
0.111111111111111111111111111111

10000000.655555555555555555555555555555
1.444444444444444444444444444445

样例输出:

0.222222222222222222222222222222
10000002.1

Ways

这里说的是大浮点数的问题,还好java给我们提供了BigDecimal可以直接使用。使用方法答题和BigInteger类很像。记得要使用stripTrailingZeros函数删除浮点小数末尾的0.

以下代码通过了4个案例中的3个,不知道其中的另外一个案例为什么没有A掉,希望读到这篇文章的读者能告诉我。

import java.util.*;
import java.math.*;

public class Main{
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            int n = scanner.nextInt();
            while (n-- != 0) {
                BigDecimal a = scanner.nextBigDecimal();
                BigDecimal b = scanner.nextBigDecimal();
                System.out.println(a.add(b).stripTrailingZeros().toString());
            }
            if (scanner.hasNext()){
                String white = scanner.nextLine();
            }
        }
    }
}

因为我没有A掉这个题,所以附上网友的答案备忘。

#include<iostream>  
#include<stdio.h>  
#include<algorithm>  
#include<string.h>  
using namespace std;  

const int Max = 100;  
int ia[Max], ib[Max], ta[Max], tb[Max], ic[Max], tc[Max];  
char in[Max], t[Max];  

int main()  
{  
    int cases, l1, l2, l3, l4, l;  
    cin >> cases;  
    while(cases--)  
    {  
        memset(ic, 0, sizeof(ic)); memset(tc, 0, sizeof(tc));  
        memset(ia, 0, sizeof(ia)); memset(ta, 0, sizeof(ta));  
        memset(ib, 0, sizeof(ib)); memset(tb, 0, sizeof(tb));  
        scanf("%s", in);  
        l = strlen(in);  
        int i;  
        for(i=0; i<l && in[i] != '.'; i++) ia[i] = in[i] - '0';  
        l1 = i++;  
        for(int j=0; j<l1/2; j++)  
        {  
            int tem = ia[l1 - 1 - j];  
            ia[l1 - 1 - j] = ia[j];  
            ia[j] = tem;  
        }  
        for(; i<l; i++) ta[i-l1-1] = in[i] - '0';  
        l2 = l - l1 - 1;  

        scanf("%s", in);  
        l = strlen(in);  
        for(i=0; i<l && in[i] != '.'; i++) ib[i] = in[i] - '0';  
        l3 = i++;  
        for(int j=0; j<l3/2; j++)  
        {  
            int tem = ib[l3 - 1 - j];  
            ib[l3 - 1 - j] = ib[j];  
            ib[j] = tem;  
        }  
        for(; i<l; i++) tb[i-l3-1] = in[i] - '0';  
        l4 = l - l3 - 1;  

        l2 = max(l2, l4);  
        int c = 0, temp;  
        for(int i=l2-1; i>=0; i--)  
        {  
            temp = ta[i] + tb[i] + c;  
            tc[i] = temp % 10;  
            c = temp / 10;  
        }  

        int f;  
        for(f=l2-1; f>=0; f--)  
            if(tc[f]) break;  

        l1 = max(l1, l3);  
        for(int j=0; j<=l1; j++)  
        {  
            temp = ia[j] + ib[j] + c;  
            ic[j] = temp % 10;  
            c = temp / 10;  
        }  

        int k;  
        for(k=l1; k>=0; k--)  
            if(ic[k]) break;  
        if(k == -1) l1 = 0;  
        else l1 = k;  

        for(int j=l1; j>=0; j--) printf("%d", ic[j]);  
        if(f != -1)  
        {  
            printf(".");  
            for(int j=0; j<=f; j++) printf("%d", tc[j]);  
        }  
        printf("\n");  
    }   
    system("pause");  
    return 0;  
}  

附录

JAVA BigDecimal 小数点处理

保留两位小数{
方法一:{
   double   c=3.154215;
   Java.text.DecimalFormat myformat=new java.text.DecimalFormat("0.00");
   String str = myformat.format(c);    
}

方式二:{
   java.text.DecimalFormat   df   =new   java.text.DecimalFormat("#.00"); 
   df.format(你要格式化的数字);
   例:new java.text.DecimalFormat("#.00").format(3.1415926)
   #.00 表示两位小数 #.0000四位小数 以此类推...
}

方式三:{
   double d = 3.1415926;
   String result = String .format("%.2f");
   %.2f %. 表示 小数点前任意位数   2 表示两位小数 格式后的结果为f 表示浮点型
}
}

四舍五入 {
double   f   =   111231.5585; 
BigDecimal   b   =   new   BigDecimal(f); 
//保留2位小数
double   f1   =   b.setScale(2,   BigDecimal.ROUND_HALF_UP).doubleValue(); 
}

Date

2017 年 3 月 8 日

posted @ 2017-03-08 21:08  负雪明烛  阅读(27)  评论(0编辑  收藏  举报