stoull是个好东西,可以省去不少手动string转int的麻烦
#include<bits/stdc++.h>
using namespace std;
using u64 = uint64_t;
int main()
{
int T; cin >> T;
for(int cs = 0; cs < T; cs++)
{
cout << "case #" << cs << ":\n";
string s; cin >> s;
auto dot = s.find('.');
u64 a = stoull(s.substr(0, dot)), n, m;
auto rec = s.find('[');
if(rec == s.npos)
{ // 有限小数
n = stoull(s.substr(dot + 1));
m = u64(pow(10, s.length() - dot - 1));
}
else
{ // 循环小数
s.erase(rec, 1);
n = stoull(s.substr(dot + 1));
if(dot + 1 != rec)n -= stoull(s.substr(dot + 1, rec - dot - 1));
m = u64(pow(10, s.length() - rec - 1)) - 1;
m *= u64(pow(10, rec - dot - 1));
}
auto g = gcd(n, m); n /= g; m /= g;
cout << n + m * a << "/" << m << "\n";
}
}
写的比较长,但是思路还算清楚,这种类型的题只要有耐心把情况细分,不用急于想出一种高明的方法把所有情况都包含在内,都是不难的。