题意:如何把一个循环小数化成分数形式
题解:循环小数分为纯循环(循环节从第一个小数开始,如:5.12341234)小数和混合循环小数(循环节不从第一位小数开始循环,如:5.12345345345)。
对于纯循环小数来说,用循环节的数字作为分子,分母为等同的位数的9组成。对于混合循环小数来说,需要所有的小数部分组成的数字减掉非循环节组成的数字然后分母为循环节位数个9和非循环节位数个0组成的数字
AC代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 10000;
typedef long long ll;
ll gcd(ll a, ll b) {
return b == 0 ? a : gcd(b, a % b);
}
int a[maxn];
int main() {
ll n, m, p;
while(~scanf("%lld.%lld %lld", &n, &m, &p)) {
if(p == 1) {
ll fz = m;
ll x = 0;
while(m) {
x = x * 10 + 9;
m /= 10;
}
ll fm = x;
fz += n * fm;
ll t = gcd(fz, fm);
printf("%lld/%lld\n", fz/t, fm/t);
} else {
ll M = m;
ll num[maxn], tot = 0;
while(M) {
num[tot++] = M % 10;
M /= 10;
}
reverse(num, num + tot);
ll sub = 0;
ll x = 0;
for(int i = 0; i < tot - p + 1; i++) {
x = x * 10 + 9;
}
for(int i = 0; i < p - 1; i++) {
x *= 10;
sub = sub*10 + num[i];
}
m -= sub;
m += n * x;
ll t = gcd(x, m);
printf("%lld/%lld\n", m / t, x / t);
}
}
return 0;
}