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 }

 

 

 

 

 

你可能感兴趣的:(HDU)