纯循环小数
例如:
0.(214)
0.(214)*1000=214.(214)①
0.(214)*1=0.(214)②
由①-②得0.(214)*999=214
故该循环小数化为分数为214/999
结论:纯循环小数转化为分数,分子为一个循环节表示的数,分母各位为9,分母的位数为循环节的位数。
混合循环小数
例如:
6.35(3)
0.35(3)*1000=353.(3)①
0.35(3)*100=35.(3)②
由①-②得0.35(3)*900=353-35
故该循环小数转化为分数为6+318/900
结论:混合循环小数转化为分数,分子为第二个循环节以前的小数部分的数与小数部分中不循环部分的数的差,分母前几位为9,后几位为0,9的个数为循环节的位数,0的个数为非循环部分的位数。
应用实践
代码如下:
#include<cstdio>
using namespace std;
int a, b, lena, lenb;
int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a % b);
}
void solve() {
a = b = lena = lenb = 0;
char ch = getchar();
while (ch != '.')ch = getchar();
ch = getchar();
while (ch != '(' && ch != '\n') {
a = (a << 1) + (a << 3) + ch - '0';
lena++;
ch = getchar();
}
if (ch == '(') {
ch = getchar();
while (ch != ')') {
b = (b << 1) + (b << 3) + ch - '0';
lenb++;
ch = getchar();
}
}
if (!b) {
int d = 1;
for (int i = 0; i < lena; i++)d *= 10;
int t = gcd(a, d);
printf("%d/%d\n", a / t, d / t);
}
else {
int mu = 1, zi = 0, d = 1;
for (int i = 0; i < lenb; i++)d *= 10;
mu = d; mu--;
for (int i = 0; i < lena; i++) mu *= 10;
zi = a * d + b - a;
int tmp = gcd(zi, mu);
printf("%d/%d\n", zi / tmp, mu / tmp);
}
}
int main(void) {
int t;
scanf("%d", &t);
while (t--)solve();
return 0;
}