题目描述
给定一个形式为 $N/D$ 的分数,其中 $N$ 表示分子,$D$ 表示分母。
请你将这个分数转化为小数,并输出。
如果转化成的小数为循环小数,则将其循环部分放入到$()$之中。
例如,$1/3=0.33333…$,那么可以表示为 $0.(3)$,$41/333=0.123123123$,那么可以表示为 $0.(123)$。
如果分数化为整数,则保留一位小数输出,例如,$6/3=2$,则输出 $2.0$。
下面是一些典型的转换样例:
1/3 = 0.(3)
22/5 = 4.4
1/7 = 0.(142857)
2/2 = 1.0
3/8 = 0.375
45/56 = 0.803(571428)
输入格式
共一行,包含两个整数 $N$ 和 $D$。
输出格式
按照题目要求,输出转化成的小数。
如果输出结果长度超过 $76$ 个字符,则分多行输出,每行最多 $76$ 个字符。
数据范围
$1≤N,D≤105$
输入样例
45 56
输出样例
0.803(571428)
算法:模拟
小学数学,好叭,我承认我小学数学不及格,那这一题做不出来也是理所应当滴。
这一题之前想得特别复杂,用 $double$ 类型变量把 $N/D$ 的结果存起来,然后一位一位看,然后就特别复杂,然后就没然后了。
看了 y 总的视频后,我觉得这个 $p[ ]$ 十分巧妙,直接就将循环节部分给断开了,处理起来就特别容易,另外 $num$ 存的就是小数部分。
思路就是模拟,不懂看 y 总视频去,一看就懂了。
C++ 代码
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 100010;
int n, d;
int p[N];
string res;
int main()
{
cin >> n >> d;
res += to_string(n / d) + '.';
n %= d;
if (!n) {
res += '0';
}
else {
string num;
memset(p, -1, sizeof(p));
while (n && p[n] == -1) {
p[n] = num.size();
n *= 10;
num += n / d + '0';
n %= d;
}
if (!n) {
res += num;
}
else {
res += num.substr(0, p[n]) + '(' + num.substr(p[n]) + ')';
}
}
for (int i = 0; i < res.size(); ++i) {
cout << res[i];
if ((i + 1) % 76 == 0) {
cout << endl;
}
}
return 0;
}
请问y总视频在哪,一直没找到
最后的if没有必要
感觉妙极了