描述
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,
这个解法跑出来就正确了,可是依旧不知道我刚开始的解法错在哪里,求大神指错!