循环小数转化为分数

纯循环小数

例如:
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的个数为非循环部分的位数。

应用实践

HDU-1717 小数化分数2

代码如下:

#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;
}
发布了104 篇原创文章 · 获赞 97 · 访问量 4515

猜你喜欢

转载自blog.csdn.net/TK_wang_/article/details/105022050