今天跑去隔壁學校比ICPC的Regional Contest

其中有一題是給循環小數,求它的最簡分數

以數學邏輯的解法來看
就是把該循環小數設為x
看它循環幾位就讓小數點往右偏移幾位(乘10、乘100之類的)
接著把兩式子相減就可以消掉循環的部位算出分數了
例如:
題目範例測資
1.6 1
所以是1.666...;
令x = 1.666...,得10x= 16.666...
接著兩式子相減
9x = 15,得出x = 15/9 = 5/3
明明比賽當下只花10分鐘就想出的邏輯
結果在coding上因為3個人share一台電腦思緒一直被打斷
到最後還是沒能debug完提交 T^T
補上回家後不甘心重寫一次的code
奇怪,回家寫就超順利,不到20分鐘就寫好…
import java.util.Scanner;
public class ProblemC {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
StringBuilder num = new StringBuilder(scanner.next());
int repeat = scanner.nextInt();
StringBuilder num10x = new StringBuilder(num.toString());
shiftDecimalPoint(num10x, repeat);
// 尾端去掉重複字節,如果結尾是'.'也去掉
num.delete(num.length() - repeat, num.length());
if (num.indexOf(".") == num.length() - 1)
num.deleteCharAt(num.indexOf("."));
int denominator = 1;
for (int i = 0; i < repeat; i++)
denominator *= 10;
denominator -= 1;
while (num.indexOf(".") != -1 || num10x.indexOf(".") != -1) {
shiftDecimalPoint(num, 1);
shiftDecimalPoint(num10x, 1);
denominator *= 10;
}
int numerator = Integer.parseInt(num10x.toString()) - Integer.parseInt(num.toString());
int gcd = findGCD(numerator, denominator);
System.out.println(numerator / gcd + "/" + denominator / gcd);
}
public static void shiftDecimalPoint(StringBuilder num, int offset) {
if (num.indexOf(".") == -1) {
for (int i = 0; i < offset; i++)
num.append("0");
} else {
int lengthAfterDecimalPoint = num.length() - num.indexOf(".") - 1;
if (offset >= lengthAfterDecimalPoint) {
num.deleteCharAt(num.indexOf("."));
for (int i = 0; i < (offset - lengthAfterDecimalPoint); i++)
num.append("0");
} else {
num.insert(num.indexOf(".") + offset + 1, '.');
num.deleteCharAt(num.indexOf("."));
}
}
}
public static int findGCD(int num1, int num2) {
while (num1 != num2) {
if (num1 > num2)
num1 -= num2;
else
num2 -= num1;
}
return num1;
}
}
請問比賽有限制哪些函式庫不能用嗎?
主辦單位沒特別說明
比賽採用的是OpenJDK
只要能compile過我相信應該都可以用