Rational Ratio(一道思维题)
Rational Ratio
思路
比赛的时候我被这道题给折磨了,说来还是太菜了。
对样例 \(0.142857\ 6\) 我们的做法是,取循环节 \(0.142857 = x\),然后我们对其左右乘以 \(10^ {6}\) 得到 \(1000000x = 142857.142857\),我们同时把循环节给减去
得到 \(99999x = 142857\) 然后得到 \(x = \frac{142856} {99999}\)求一个最大公约数,然后再约去就得到了答案\(\frac{1}{7}\)。
对样例 \(123.456\ 2\) 分析,首先我们对 \(123.456 \times 10 = 1234.56 = 123456 + x\),
通过上面的步骤我们得到 \(99x = 56\),\(1234.56 = \frac{1234 \times 99 + 56} {99} = \frac{122222}{99}\)。
所以原式 \(123.456 = \frac{1234.56}{10} = \frac{122222}{99 \times 10}\),再求一个公因数就可以得到答案了。
这两个样例理解了自然就明白如何做了吧,关键就是要找 \(x\),接下来的就好写了。
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll gcd(ll a, ll b) {
return b ? gcd(b, a % b) : a;
}
int main() {
// freopen("in.txt", "r", stdin);
string str;
int l;
cin >> str >> l;
int n = str.size();
ll a = 0, b = 0;
int pos;
for(int i = 0; i < n - l; i++) {
if(str[i] != '.')
a = a * 10 + str[i] - '0';
else pos = i;
}
for(int i = n - l; i < n; i++)
b = b * 10 + str[i] - '0';
ll c = pow((ll)10, l) - 1;
b += c * a;
c *= pow((ll)10, n - l - pos - 1);
ll d = gcd(b, c);
// cout << b << c << endl;
printf("%lld/%lld\n", b / d, c / d);
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步