
赶论文:论文里无限循环小数到底是由哪两个数除出来的呢?求分母最小的那一对。
2.6 数学问题的解题窍门
小学奥数水平的无聊题目,没做过无限循环小数的奥数题也无妨,看看百度百科里的公式就可以套出来:
纯循环
用9做分母,有多少个循环数就几个9,比如0.3,3的循环就是9分之3,0.654,654的循环就是999分之654, 0.9,9的循环就是9分之9(1),以此类推。
混循环
先来看几个例子
例:把混循环小数0.228˙化为分数:
解:0.228˙
=[(228/1000)+8/9000)]
=228/(900+100)+8/9000
=[(228/900)-(228/9000)]+(8/9000)
=(228/900)+[(8/9000)-(228/9000)]
=(228/900)-(22/900)
=(228-22)/900
=206/900
=103/450;
例:把混循环小数0.123˙68˙化成分数:
解:0.123˙68˙=(0.12368+0.00000˙68˙)
=(12368/100000)+(68/9900000)
=[(12368/99000)-(12368/990000)]+(68/9900000)
=(12368/99000)+[(68/9900000)-(12368/9900000)]
=(12368/99000)-(12300/9900000)
=(12368-123)/99000
公式
用9和0做分母,首先有几个循环节就几个9,接着有几个没加入循环的数就加几个0,再用小数点后面的数减 没加入循环的数,比如0.43,3的循环,有一位数没加入循环,就在9后面加一个0做分母,再用43减4做分子,得 90分之39,0.145,5的循环就用9后面加2个0做分母,再用145减14做分子,得900分之131,0.549,49的循环,就 用99后面加1个0做分母,用549减5做分子,最后得990分之545,以此类推,能约分的要化简。
关键点在于题目在玩文字游戏,循环小数到底从哪一位开始没有明说,所以无脑暴力穷举一遍就行了。
#ifndef ONLINE_JUDGE
#pragma warning(disable : 4996)
#endif
#include <iostream>
#include <string>
#include <limits>
using namespace std;
typedef unsigned long long ULL;
ULL gcd(ULL a, ULL b)
{
if (b == 0)return a;
return gcd(b, a%b);
}
ULL ten_pow(unsigned int x)
{
ULL result = 1;
for (unsigned int i = 0; i < x; ++i)
{
result *= 10;
}
return result;
}
///////////////////////////SubMain//////////////////////////////////
int main(int argc, char *argv[])
{
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif
string line;
while (cin >> line)
{
if (line == "0")
{
break;
}
string digit = line.substr(2, line.length() - 5);
unsigned int length = digit.length();
const ULL n = atoi(digit.c_str());
if (n == 0)
{
cout << "0/1" << endl;
continue;
}
ULL min_x = numeric_limits<ULL>::max();
ULL min_y = 0;
for (int i = 1; i <= length; ++i)
{
string first = digit.substr(0, length - i);
ULL x = ten_pow(length) - ten_pow(length - i);
ULL y = n - atoi(first.c_str());
ULL d = gcd(x, y);
x /= d;
y /= d;
if (min_x > x)
{
min_x = x;
min_y = y;
}
}
cout << min_y << '/' << min_x << endl;
}
#ifndef ONLINE_JUDGE
fclose(stdin);
fclose(stdout);
system("out.txt");
#endif
return 0;
}
///////////////////////////End Sub//////////////////////////////////
知识共享署名-非商业性使用-相同方式共享:码农场 » POJ 1930 Dead Fraction 题解 《挑战程序设计竞赛》
码农场