HDU1717+小数化分数

题意:小数化分数

有限小数:小数点后面有几位就乘以 10^n 最后 分子则为乘积,分母则为1*10^n (记得约分)

混无限循环小数:

循环节+非循环节(’+‘表示连接起来)-非循环节=分子

分母:循环节有几位(从左往右)就有几位9,非循环节有几位就有几位0

比如:0.1(305)

分子:1305-1

分母:9990

纯循环小数:

设n=循环节的位数

分子=10^n*(小数部分也就是循环节)

分母=n位9

例如:

0.(3053)

分子=3053

分母=9999

 

附代码

View Code
 1 #include<stdio.h>
 2 #include<math.h>
 3 #include<string.h>
 4 int gcd( int a,int b ){
 5     int r;
 6     while( b!=0 ){
 7         r=a%b;
 8         a=b;
 9         b=r;
10     }
11     return a;
12 }
13 int main(){
14     char a[ 24 ];
15     int num1[ 24 ],num2[ 24 ];
16     int cnt1,cnt2;
17     int t;
18     scanf("%d",&t);
19     while( t-- ){
20         scanf("%s",a);
21         int len=strlen(a);
22         int flag=-1;
23         cnt1=cnt2=0;
24         for( int i=2;i<len;i++ ){
25             if( flag==1 )
26                 break;
27             if( a[i]!='(' ){
28                 num1[ cnt1++ ]=a[i]-'0';
29             }
30             else if( a[i]=='(' ){
31                 flag=1;
32                 for( int j=i+1;a[j]!=')';j++ ){
33                     num2[ cnt2++ ]=a[j]-'0';
34                 }
35             }
36         }
37         int fenzi,fenmu;
38         if( flag==-1 ){//有限小数
39             fenmu=(int)(pow(10.0,cnt1));
40             fenzi=0;
41             int tt=0;
42             for( int i=cnt1-1;i>=0;i-- ){
43                 fenzi+=(num1[i]*(int)(pow(10.0,tt)));
44                 tt++;
45             }
46             tt=gcd(fenzi,fenmu);
47             printf("%d/%d\n",(fenzi/tt),(fenmu/tt));
48             continue;
49         }
50         if( cnt1==0 ){//纯循环小数
51             fenzi=fenmu=0;
52             int tt=0;
53             for( int i=cnt2-1;i>=0;i-- ){
54                 fenzi+=(num2[i]*(int)(pow(10.0,tt)));
55                 fenmu+=(9*(int)(pow(10.0,tt)));
56                 tt++;
57             }
58             tt=gcd(fenzi,fenmu);
59             printf("%d/%d\n",(fenzi/tt),(fenmu/tt));
60             continue;
61         }
62         //混循环小数
63         fenzi=fenmu=0;
64         int tt=0;
65         //fenmu=(int)(pow(10.0,cnt1));
66         int delta=0;
67         for( int i=cnt1+cnt2-1;i>=0;i-- ){
68             if( i>=cnt1 ){
69                 fenzi+=(num2[i-cnt1]*(int)(pow(10.0,tt)));
70                 fenmu+=(9*(int)(pow(10.0,tt+cnt1)));
71                 tt++;
72             }
73             else{
74                 fenzi+=(num1[i]*(int)(pow(10.0,tt)));
75                 delta+=(num1[i]*(int)pow(10.0,tt-cnt2));
76                 //fenmu+=(9*(int)(pow(10.0,tt)));
77                 tt++;
78             }
79         }
80         fenzi-=delta;
81     //    printf("ans:%d %d\n",fenzi,fenmu);
82         tt=gcd(fenzi,fenmu);
83         printf("%d/%d\n",(fenzi/tt),(fenmu/tt));
84     }
85     return 0;
86 }

 

 

 

 

 

posted @ 2013-02-20 21:43  xxx0624  阅读(393)  评论(0编辑  收藏  举报