b_nk_a/b(map记录循环节初始时的位置)

求a/b的小数表现形式。如果a可以整除b则不需要小数点。如果是有限小数,则可以直接输出。如果是无限循环小数,则需要把小数循环的部分用"()"括起来。

void run() {
	Scanner sc = new Scanner(new BufferedInputStream(System.in));
	final int a = sc.nextInt(), b = sc.nextInt();
	int i = a / b;
	int j = a % b;
	StringBuilder ans = new StringBuilder();
	ans.append(i);
	if (j > 0) {
		ans.append(".");
		//map记录循环节的开始部分在ans中的位置,方便插入")"
		Map<Integer, Integer> map = new HashMap<>();
		while (j > 0) {
			j *= 10;
			//被除数再次出现就代表商出现循环节
			if (map.containsKey(j)) {
				ans.insert(map.get(j), "(");
				ans.append(")");
				break;
			}
			map.put(j, ans.length());
			ans.append(j / b);
			j %= b;
		}
	}
	System.out.println(ans);
}
原文地址:https://www.cnblogs.com/wdt1/p/15357875.html