求a/b的小数表现形式。如果a可以整除b则不需要小数点。如果是有限小数,则可以直接输出。如果是无限循环小数,则需要把小数循环的部分用"()"括起来。
输入描述:
两个整数a和b,其中 0 <= a <= 1000 000 1 <= b <= 10 000
输出描述:
一个字符串,该分数的小数表现形式
示例1
输入
10 1
输出
10
说明
10/1 = 10
示例2
输入
1 2
输出
0.5
说明
1/2 = 0.5
示例3
输入
1 3
输出
0.(3)
说明
1/3 = 0.333333...
示例4
输入
1 6
输出
0.1(6)
说明
1/6 = 0.16666666....
示例5
输入
1 7
输出
0.(142857)
说明
1 / 7 = 0.1428571428...
这是一道经典的模拟除法的题目,注意,判断是否循环的标准,是看被除数是否重复出现,而不是答案是否重复出现。所以需要用Hash表记录下每一次出现的a以及位置,如果发现a重复出现了,说明循环了。输出的时候分为三部分,先输出整数部分,小数部分分为循环前的部分和循环的部分,依次思路可以写出代码
#include <iostream>
#include <unordered_map>
#include <vector>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
int res = a / b;
cout << res;
a = a % b;
if (a == 0) return 0; // 能整除情况
cout << '.';
unordered_map<int,int> map;
vector<int> arr;
int i = 0;
while (a != 0) {
if (map.find(a) == map.end()) {
arr.push_back(a * 10 / b); // 答案
map[a] = i; // 除数a的位置
i++;
a = a * 10 % b;
}
else {
int k = map[a]; // 输出之前的答案
for (int j = 0; j < k; j++) cout << arr[j];
cout << '('; // 输出小数循环的答案
for (int j = k; j < i; j++) cout << arr[j];
cout << ')';
return 0;
}
}
}