题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=1199
又是一个涨知识的题目,小数变分数很好的知识。
一下为百度内容,写的很好贴过来。加上很自己的理解。
对于纯循环小数,转换方法是:循环节做分子;分母全是9,9的个数为循环节长度。。再约分即可
例:0.1111111...=1/9, 我自己的理解是,10%9=1, 10%9=10,......很有可能很多人都不知道我在说什么。。。。自己理解下就ok了。
0.123 123 123....=123/999=41/333
0.35 35 35..=35/99
对于混循环小数,转换方法是:分子为两数(非循环部分+循环部分,和循环部分)之差-----被减数:小数点后第一位的数直到第一个循环节结束,这几个数字构成的数作为被减数;减数:未参与循环的小数部分,分母由9和0组成,9的个数为循环节长度,0的个数为未循环部分长度。。再约分即可
例:0.1 23 23 23 23....=(123-1)/990=122/990=61/495
0.73 865 865 865...=(73865-73)/99900=73792/99900=18448/24975
0.32 11111111...=(321-32)/900=289/900
很好很强大的一道题。。
加上自己的code:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
using namespace std;
typedef long long INT;
const INT _10[] = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000};
const INT _9[] = {1, 9, 99, 999, 9999, 99999, 999999, 9999999, 99999999, 999999999};
INT gcd(INT a, INT b)
{
if(b == 0) return a;
return gcd(b, a % b);
}
int main()
{
// freopen("1.txt", "r", stdin);
INT T;
cin >> T;
while(T --){
INT n, m, x, y;
cin >> n >> m >> x >> y;
INT fenz = x * _10[m] + y - x;
INT fenm = _9[m] * _10[n];
INT fen = gcd(fenz, fenm);
printf("%lld / %lld\n", fenz / fen, fenm / fen);
}
return 0;
}
待续未完。。。。。后续补充分数变小数(可能是循环的小数)的内容