首页 > ACM题库 > HDU-杭电 > HDU 1753 大明A+B-高精度-[解题报告] java
2013
12-21

HDU 1753 大明A+B-高精度-[解题报告] java

大明A+B

问题描述 :

话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。
这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。

现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。

输入:

本题目包含多组测试数据,请处理到文件结束。
每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。

输出:

请在一行里面输出输出A+B的值,请输出最简形式。详细要求请见Sample Output。

样例输入:

1.1 2.9
1.1111111111 2.3444323343
1 1.1

样例输出:

4
3.4555434454
2.1

这题用c写过,想不到用java  用了这么长的时间,期间还用java的BigDecimal来做,后来发现事多了个输出语句,我真2

不过可以顺便回顾下BigDecimal的应用

import java.util.Scanner;
public class Main {
    public static void main(String[]args)
    {
    int n,b,k;
  double sum;
    Scanner cin=new Scanner(System.in);
    n=cin.nextInt();
    while(n!=0)
    {
        n--;
        sum=0;
        b=cin.nextInt();
        for(int i=1;i<=b;i++)
        {
            if(i%2==0)
                sum-=1.0/i;
            else sum+=1.0/i;
        }
        System.out.format("%.2f",sum);
        System.out.println();
        //System.out.println("sad");
         
    }
    }
}

有个地方搞不懂,输出的时候 

 System.out.format(“%.2f”,sum);

        System.out.println();            ——->是对的

但是输出System.out.format(“%.2f/n”,sum);   —–>是错的     有什么区别么??????

 

 

 

 

 

大数版的,无法做出来,是应为最后腰输出精度无法确定。。

 

设置精度的语句f.setScale(2,BigDecimal.ROUND_DOWN);前参为精度,后参为舍去的方法

 

 double z=1,m=3, j;

//        j=z/m;

//        BigDecimal s1=new BigDecimal(Double.toString(1));//将double类型转化为BigDecimal要用double 的toString方法因为BigDecimal的内部实现使用字符串

//        BigDecimal s2=new BigDecimal(j);

BigDecimal类型之间的加减法分别调用  add和  subtract(调用玩函数不能忘记复制给BIgDecimal!!!)

 

 

import java.math.BigDecimal;
import java.util.Scanner;
public class Main {
    public static void main(String[]args)
    {
//        
//        double z=1,m=3, j;
//        j=z/m;
//        BigDecimal s1=new BigDecimal(Double.toString(1));
//        BigDecimal s2=new BigDecimal(j);
//        System.out.println(s2);
    int n,b;
    double k;
    BigDecimal f;
    Scanner cin=new Scanner(System.in);
    n=cin.nextInt();
    System.out.println(n);
    while(n!=0)
    {
        n--;
     f=new BigDecimal(0);
        b=cin.nextInt();
        for(double i=1;i<=b;i++)
        {
            
            BigDecimal s=new BigDecimal(1/i);
         
        //System.out.println("s"+f.add(s));
            if(i%2==0)
                f=f.subtract(s);
                      
            else f=f.add(s);
        }
         
           System.out.println(f.setScale(2,BigDecimal.ROUND_DOWN));
    }
    }
}

 

 

本来很简单的题,扩散到大数上去了,不过也好,学到东西了

 

 

之后用这个很轻松干掉1753 注意  stripTrailingZeros();有把原来用科学技术改成平常的作用!

hdu 1753

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

public class Main {
   
    public static void main(String []args)
    { 
    	
    	Scanner cin=new Scanner(System.in);
    	String a,b;
    	while(cin.hasNext()){
    		
    	a=cin.next();b=cin.next();
    	BigDecimal aa=new BigDecimal(a);
    	BigDecimal bb=new BigDecimal(b);
    	 
    	 
 
    	System.out.println(aa.add(bb).stripTrailingZeros().toPlainString());
    	}
    }
}

解题报告转自:http://blog.csdn.net/hdxiaoyu2/article/details/6221972


  1. 在方法1里面:

    //遍历所有的边,计算入度
    for(int i=0; i<V; i++)
    {
    degree = 0;
    for (j = adj .begin(); j != adj .end(); ++j)
    {
    degree[*j]++;
    }
    }

    为什么每遍历一条链表,要首先将每个链表头的顶点的入度置为0呢?
    比如顶点5,若在顶点1、2、3、4的链表中出现过顶点5,那么要增加顶点5的入度,但是在遍历顶点5的链表时,又将顶点5的入度置为0了,那之前的从顶点1234到顶点5的边不是都没了吗?

  2. 第二块代码if(it != mp.end())应改为if(it != mp.end() && (i+1)!=(it->second +1));因为第二种解法如果数组有重复元素 就不正确

  3. 题本身没错,但是HDOJ放题目的时候,前面有个题目解释了什么是XXX定律。
    这里直接放了这个题目,肯定没几个人明白是干啥