0%

小数化分数

今天回顾了一下以前的题,小数化分数。

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1717
思路:首先要知道无限循环小数分数形式的构造方法:分子为最小循环节,分
母为分子对应位数的每个数都化成 9, 如已知无限循环小数:0.4747……以 47
为循环节,那么这个小数的分数形式就是 47/99,题中,我们将小数的有限部分
和无限循环部分分开处理,得到两个分数,再相加化简,所得即为所求。
以下是AC代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int N;
string s;
ll s1,s2,n,m;

ll gcd(ll a,ll b){
if(b==0) return a;
return gcd(b,a%b);
}

void solve(){
cin>>s;
s1=s2=n=m=0;
int i=2;
while(s[i]!='('&&i<s.length()){
s1=s1*10+s[i]-48;
n++;
i++;
}
i++;
while(s[i]!=')'&&i<s.length()){
s2=s2*10+s[i]-48;
i++;
m++;
}
if(m){
s2=s2+(pow(10.0,m/1.0)-1)*s1;
s1=pow(10.0,n/1.0)*(pow(10,m/1.0)-1);
ll k=gcd(s2,s1);
cout<<s2/k<<"/"<<s1/k<<endl;
}
else{
s2=pow(10.0,n/1.0);
ll k=gcd(s1,s2);
cout<<s1/k<<"/"<<s2/k<<endl;
}

}

int main()
{
ios::sync_with_stdio(false);
cin>>N;
while(N--){
solve();
}
return 0;
}

-------------本文结束感谢您的阅读-------------