小数化分数,嗯。
看到这题,多思考。。(careful consideration;deliberate;thoughtful
普通小数就不用说了吧, 有几位除以1后带几位零的数。
循环真是怎么办好呢,好多呢,算不出来吧,我也不会。那就删了好了。
怎么删呢?
copy:case
⑴ 把0.4747……和0.33……化成分数。
想1: 0.4747……×100=47.4747……
0.4747……×100-0.4747……=47.4747……-0.4747……
(100-1)×0.4747……=47
即99×0.4747…… =47
那么 0.4747……=47/99
想2: 0.33……×10=3.33……
0.33……×10-0.33……=3.33…-0.33……
(10-1) ×0.33……=3
即9×0.33……=3
那么0.33……=3/9=1/3
由此可见, 纯循环小数化分数,它的小数部分可以写成这样的分数:纯循环小数的循环节最少位数是几,分母就是由几个9组成的数;分子是纯循环小数中一个循环节组成的数。
⑵把0.4777……和0.325656……化成分数。
想1:0.4777……×10=4.777……①
0.4777……×100=47.77……②
用②-①即得:
0.4777……×90=47-4
所以, 0.4777……=43/90
想2:0.325656……×100=32.5656……①
0.325656……×10000=3256.56……②
用②-①即得:
0.325656……×9900=3256.5656……-32.5656……
0.325656……×9900=3256-32
所以, 0.325656……=3224/9900
将纯循环小数改写成分数,分子是一个循环节的数字组成的数;分母各位数字都是9,9的个数与循环节中的数字的个数相同.
将混循环小数改写成分数,分子是不循环部分与第一个循环节连成的数字组成的数,减去不循环部分数字组成的数之差;分母的头几位数字是9,末几位数字是0,9的个数跟循环节的数位相同,0的个数跟不循环部分的数位相同.
copy not ending:
AK 代码:
#include<iostream>
using namespace std;
int f(int a, int b)
{
while(a%b)
{
int w = a % b;
a = b;
b = w;
}
return b;
}
int main()
{
int t;
cin >> t;
while(t--)
{
char str[15];
cin >> str;
int x= 0, y = 0, p = 0, q = 0, a = 1, b = 1, m, w = 0, d, s;
for(int i = 2; str[i] != '\0'; i++)
{
if(!w && str[i] != '(')
{
p++;
x *= 10;
x += str[i] - '0';
}
if(w && str[i] != ')')
{
q++;
y *= 10;
y += str[i] - '0';
}
if(str[i] == '(')
{
w = 1;
y = x;
q = p;
}
}
if(!q)
{
while(p--)
a *= 10;
m = f(x, a);
a /= m;
x /= m;
cout << x << '/' << a << endl;
}
else
{
d = y-x;
while(p--)
a*=10;
while(q--)
b*=10;
s = b-a;
m = f(d, s);
s /= m;
d /= m;
cout << d << '/' << s << endl;
}
}
return 0;
}
(当然代码是自己打出来的,思路什嘛的完全完全摘自博客:
http://blog.163.com/huangzhifei2009@126/blog/static/12376126720097316513817/