BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / acm-icpc / #91499同步于 2016/10/22
ACM_ICPC机器人发帖

UVA202 Repeating Decimals代码求解

shirley1994
2016/10/22镜像同步0 回复
####UVA202 Repeating Decimals [原题链接](https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=138) 大意就是给两个数,分子和分母。求其所得小数的循环节长度和其小数部分。 例如输入 "3 77" 输出 3/77 = 0.(038961) 6 = number of digits in repeating cycle 输入"41 468" 输出 41/468 = 0.08(760683) 6 = number of digits in repeating cycle 我是用Java写的程序。提交后显示runtime error。 思路大致是分别处理分子是0;商为不循环小数;商为循环小数。 测试数据都是对的,不知道为什么提交就是会报错。各位大神帮忙看一下哪里有问题。代码如下 ```java import java.text.DecimalFormat; import java.util.Scanner; import java.util.StringTokenizer; public class Main { /** * judge whether the number is * pure circulating decimal(-1) * or mixed recurring decimal(the length of the non-repeating part) * or non-repeating decimal(0) * @param num * @return */ public static int prime(int num){ //pure circulating decimal if (num%2 != 0 && num%5 != 0) return 0; else{ int prime2 = 0, prime5 = 0; while(num != 1){ if (num%2 == 0){ prime2++; num /= 2; } else if (num%5 == 0){ prime5++; num /= 5; } else return Math.max(prime2,prime5);//mixed recurring decimal } return 20;//non-repeating decimal } } public static void main(String[] args) { Scanner input = new Scanner(System.in); String in = new String(); while(!(in = input.nextLine()).equals("")){ StringTokenizer token = new StringTokenizer(in); int numerator = Integer.valueOf(token.nextToken()); int denominator = Integer.valueOf(token.nextToken()); if (numerator == 0){ System.out.println(numerator+"/"+denominator+" = 0.(0)"); System.out.println(" 1 = number of digits in repeating cycle\n"); }else{ int prime = prime(denominator); if (prime == 20){ double res = (double)numerator/(double)denominator; DecimalFormat df = new DecimalFormat(); df.setMaximumFractionDigits(5); // 设置最大小数位,由于最大3000,5位小数就够了 String result = df.format(res); String dot = (numerator%denominator==0)? "." : ""; System.out.println(numerator+"/"+denominator+" = "+result+dot+"(0)"); System.out.println(" 1 = number of digits in repeating cycle\n"); }else{ int number = numerator / denominator; int tmp_numerator = numerator - number*denominator; int remainder = 0; int divisor = tmp_numerator*10; int quotient = 0; int standard = tmp_numerator; String cycle = ""; String noncycle = ""; //non-repeating part for (int i = 0; i < prime; i++) { quotient = divisor / denominator; noncycle += quotient; standard = divisor % denominator; divisor = standard * 10; } //repeating part while (remainder != standard){ quotient = divisor / denominator; cycle += quotient; remainder = divisor % denominator; divisor = remainder * 10; } if (cycle.length()>50) System.out.println(numerator+"/"+denominator+" = "+number+"."+noncycle+"("+cycle.substring(0,50)+"...)"); else System.out.println(numerator+"/"+denominator+" = "+number+"."+noncycle+"("+cycle+")"); System.out.println(" "+cycle.length()+" = number of digits in repeating cycle\n"); } } } } } ```
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。