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 }
keep moving...