1.有限循环小数化成分数
例1:
0.5
0.5*10=5;
0.5 = 5/10 = 1/2;
例2:
0.3275
0.3275 * 10000 = 3275
0.3275 = 3275/10000 = 131/400 ;
2.无限循环小数化分数
例1:
0.(4)
0.(4) * 10 = 4.(4) ①
0.(4) * 1 = 0.(4) ②
① - ② = 0.(4) * 9 = 4;
0.(4) = 4/9 ;
例2:
0.32(692307)
0.32(692307) * 10^8 = 32692307.(692307) ①
0.32(692307) * 100 = 32.(692307) ②
① - ② = 0.32(692307) *(10^8 - 10^2 ) = 32692307 - 32
0.32(692307) = (32692307 - 32) / (10^8 - 10^2 ) ;
3.无限不循环小数无法化成分数
CODE:
- #include<iostream>
- using namespace std;
- int gcd( int a, int b)
- {
- while(b)
- {
- a %= b;
- a ^= b;
- b ^=a; a ^=b;
- }
- return a;
- }
- int base[]={1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000};
- int main()
- {
- int t,i;
- scanf("%d",&t);
- char str[20];
- while(t--)
- {
- scanf("%s",str);
- int len=strlen(str);
- len-=2;
- for(i=0;i<len;i++)
- str[i]=str[i+2];
- str[len]=0;
- int sum=0,k=0,ans,sum2=0;
- bool judge=true;
- for(i=0;i<len;i++)
- {
- if(str[i]=='(')
- {
- k=i;
- judge=false;
- }
- if(str[i]>='0'&&str[i]<='9')
- {
- sum = sum*10+str[i]-'0';
- if(judge)
- sum2=sum2*10+str[i]-'0';
- }
- }
- if(!judge)
- {
- ans =base[len-2]-base[k];
- sum-=sum2;
- }
- else
- ans=base[len];
- int r = gcd(sum,ans);
- printf("%d/%d\n",sum/r,ans/r);
- }
- return 0;
- }