小数化分数

【问题描述】

       任何小数都能表示成分数的形式,对于給定的小数,编写程序其化为最简分数输出,小数包括简单小数和循环小数。

【输入形式】

       第一行是一个整数N,表示有多少组数据。
       每组数据只有一个纯小数,也就是整数部分为0。小数的位数不超过9位,循环部分用()括起来。

【输出形式】

        对每一个对应的小数化成最简分数后输出,占一行

【样例输入】

3
0.(4)
0.5
0.32(692307)

【样例输出】

4/9
1/2

17/52

 : #include<iostream>
 : #include<cmath>
 : #include<string>
 : using namespace std;
 : void yue(int,int);
2 : int main() {
2 :     int n,i,j,a=0,b=0,fen=0,fen1=0,fen2=0,fenm=0;
2 :     cin>>n;
11 :     string str[n];
10 2 :     for(i=0; i<n; i++) cin>>str[i];
11 9 :     for(i=0; i<n; i++) {
12 7 :         a=0;
13 7 :         b=0;
14 48 :         for(j=0; j<str[i].size(); j++) {
15 41 :             if(str[i][j]=='(') a=j;
16 41 :             if(str[i][j]==')') b=j;
17  :         }
18 7 :         fen=0;
19 7 :         fen1=0;
20 7 :         fen2=0;
21 7 :         fenm=0;
22 7 :         if(a==0&&b==0) {
23 4 :             for(j=2; j<str[i].size(); j++) {
24 2 :                 fen=(str[i][j]-'0')+fen;
25 2 :                 fen*=10;
26 2 :                 if(j==str[i].size()-1) fen/=10;
27  :             }
28 2 :             yue(fen,pow(10,str[i].size()-2));
29  :         } else {
30 25 :             for(j=2; j<b; j++) {
31 20 :                 if(j==a) continue;
32 15 :                 fen1=(str[i][j]-'0')+fen1;
33 15 :                 fen1*=10;
34 15 :                 if(j==b-1) fen1/=10;
35  :             }
36 10 :             for(j=2; j<a; j++) {
37 5 :                 fen2=(str[i][j]-'0')+fen2;
38 5 :                 fen2*=10;
39 5 :                 if(j==a-1) fen2/=10;
40  :             }
41 5 :             fenm=pow(10,b-3)-pow(10,a-2);
42 5 :             yue(fen1-fen2,fenm);
43  :         }
44  :     }
45 11 :     return 0;
46  : }
47 7 : void yue(int x,int y) {
48  :     int i;
49 102 :     for(i=2; i<=x; i++) {
50 95 :         if(x%i==0&&y%i==0) {
51 14 :             y/=i;
52 14 :             x/=i;
53 14 :             i=2;
54  :         }
55  :     }
56 7 :     cout<<x<<'/'<<y<<endl;
57 13 : }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值