2019快手校招面试题循环小数

求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;
		}
	}
}

猜你喜欢

转载自blog.csdn.net/wwxy1995/article/details/89478948