SOJ 连分数问题解题报告

来源:互联网 发布:软件开发工作计划表 编辑:程序博客网 时间:2024/06/05 17:54

描述

meizhouyihei最近特别烦,因为他的好队友Mr_L和maxichu给他出了道题,而他做不出来.
他不想在队友面前丢脸,所以只好向你们寻求帮助了。
题目是这样的,有一种高度为n的连分数(如图所示)

有两个正整数p和q,分别作为分数p/q的分子和分母
然后给出连分数的高度n和n个正整数a1~an
问p/q和连分数的值是否相等。如果你能帮meizhouyihei解决这个问题,他会答应你一个要求哦。
Input

第一行包含两个整数p,q(中间有空格)

1≤q≤p≤10^18,表示分数p/q的分子和分母。

第二行是整数n (1≤n≤90),表示连分数的高度。

第三行是n个以空格隔开的整数a1,a2,…,an(1≤ai≤10^18),就是连分数中的那些数。
Output

如果p/q和连分数的值相等,那么输出“Yes”,否则输出“No”(没有引号)。
Example Input

9 4
2
2 4
9 4
3
1 2 4

Example Output

YES
NO
刚开始拿到这道题时想着是从后往前推,除了a[0]即a1外,用for循环计算连分数,并用BigDecimal来处理精度的问题
以下便是我的代码

package acm;import java.util.*;import java.math.*;public class Main{    public static void main(String[] args) {    Scanner input = new Scanner(System.in);    double p,q;    while(input.hasNext()){    p=input.nextDouble();    q=input.nextDouble();    int n = input.nextInt();    double[] a = new double[n];    BigDecimal p1 = new BigDecimal(Double.toString(p));    BigDecimal q1 = new BigDecimal(Double.toString(q));    double c = p1.divide(q1,2, BigDecimal.ROUND_HALF_EVEN).doubleValue();    for(int i=0;i<n;i++){        a[i] = input.nextDouble();    }    double sum = a[0],sum2 = 0;    if(a.length>1){         BigDecimal ax= new BigDecimal(Double.toString(a[n-1]));        double sum1;        sum1=BigDecimal.ONE.divide(ax,2, BigDecimal.ROUND_HALF_EVEN).doubleValue();        if(n>2){         for(int i=n-2;i>0;i--){             sum1+=a[i];             BigDecimal az = new BigDecimal(Double.toString(sum1));             sum2 = BigDecimal.ONE.divide(az,2, BigDecimal.ROUND_HALF_EVEN).doubleValue();         }        }        else sum2= sum1;        }    sum+=sum2;     if(sum==c) System.out.println("YES");    else System.out.println("NO");    }    input.close();    }}

但是提交时却一直为WA也不知道错在哪里 所以问来了其他人的做法

package acm;import java.math.BigInteger;import java.util.Scanner;public class acm1 {    public static void main(String[] args){        BigInteger p=BigInteger.ONE,q=BigInteger.ONE,a=BigInteger.ONE;        int n;        boolean flag=false;        Scanner cin = new Scanner(System.in);        while (cin.hasNext()) {            p=cin.nextBigInteger();            q=cin.nextBigInteger();            n=cin.nextInt();            flag=false;            for(int i=0;i<n;i++){                a=cin.nextBigInteger();                if(!flag&&i!=n-1){                    p=p.subtract(a.multiply(q));                    if(p.compareTo(BigInteger.valueOf(0))<=0){                        flag=true;                    }                    BigInteger tBigInteger = p;                    p = q;                    q = tBigInteger;                }            }            if(flag){                System.out.println("NO");            }            else{                if(p.mod(q).equals(BigInteger.valueOf(0))&&p.divide(q).equals(a)){                    System.out.println("YES");                }                else System.out.println("NO");            }        }    }}

如果说我的是采取自底向上,那么这个就是从前往后推,每次用减法减去q*ai的值赋给P,再将p和q的值对换,到最后一个an时不做判断,等退出循环后再判断p/q是否与an相等,且p%q是否为0,

这个解法跑出来就正确了,可是依旧不知道我刚开始的解法错在哪里,求大神指错!

0 0
原创粉丝点击