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
- SOJ 连分数问题解题报告
- SOJ Dollars 解题报告
- soj 4018upit解题报告 splay经典应用
- 【浇水问题】解题报告
- 【过河问题】解题报告
- 石子问题解题报告
- 装载问题 解题报告
- 迷宫问题 解题报告
- 零点问题 解题报告
- 【解题报告】硬币问题
- 核电站问题 解题报告
- 添边问题 解题报告
- 括号匹配问题解题报告
- POJ_1321 棋盘问题解题报告
- poj3984迷宫问题解题报告
- 2SAT问题解题报告
- 解题报告 ch1 字符串问题
- 解题报告 ch1 大数问题
- MAHOUTR 安装详解
- Android Service
- 《ArcGIS Engine+C#实例开发教程》第二讲 菜单的添加及其实现
- 使用csdn-markDown编辑器
- Android继承ActionBarActivity之后,出现闪退情况解决方法
- SOJ 连分数问题解题报告
- Spring security AccessDeniedHandler 不被调用
- 二套房首付只要四成了,你们第一套房买了吗?
- Windows界面编程第三篇 异形窗体
- OC与C的语言联系
- 很详细的Objective-C内存管理教程和原理剖析
- 确定一个子字符串在主字符串中出现了多少次
- Android开发环境搭建
- git忽略对已入库文件的追踪