SOJ 连分数问题解题报告

描述

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值