首页 > ACM题库 > HDU-杭电 > hdu 2011 多项式求和-高精度-[解题报告]java
2013
12-26

hdu 2011 多项式求和-高精度-[解题报告]java

多项式求和

问题描述 :

多项式的描述如下:
1 – 1/2 + 1/3 – 1/4 + 1/5 – 1/6 + …
现在请你求出该多项式的前n项的和。

输入:

输入数据由2行组成,首先是一个正整数m(m<100),表示测试实例的个数,第二行包含m个正整数,对于每一个整数(不妨设为n,n<1000),求该多项式的前n项的和。

输出:

输入数据由2行组成,首先是一个正整数m(m<100),表示测试实例的个数,第二行包含m个正整数,对于每一个整数(不妨设为n,n<1000),求该多项式的前n项的和。

样例输入:

2
1 2

样例输出:

1.00
0.50

这题用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. 约瑟夫也用说这么长……很成熟的一个问题了,分治的方法解起来o(n)就可以了,有兴趣可以看看具体数学的第一章,关于约瑟夫问题推导出了一系列的结论,很漂亮

  2. 有限自动机在ACM中是必须掌握的算法,实际上在面试当中几乎不可能让你单独的去实现这个算法,如果有题目要用到有限自动机来降低时间复杂度,那么这种面试题应该属于很难的级别了。