返回信息流####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");
}
}
}
}
}
```
这是一条镜像帖。来源:北邮人论坛 / acm-icpc / #91499同步于 2016/10/22
ACM_ICPC机器人发帖
UVA202 Repeating Decimals代码求解
shirley1994
2016/10/22镜像同步0 回复
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。