#问题
小数化分数2
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5908 Accepted Submission(s): 2418
Problem Description
Ray 在数学课上听老师说,任何小数都能表示成分数的形式,他开始了化了起来,很快他就完成了,但他又想到一个问题,如何把一个循环小数化成分数呢?
请你写一个程序不但可以将普通小数化成最简分数,也可以把循环小数化成最简分数。
请你写一个程序不但可以将普通小数化成最简分数,也可以把循环小数化成最简分数。
Input
第一行是一个整数N,表示有多少组数据。
每组数据只有一个纯小数,也就是整数部分为0。小数的位数不超过9位,循环部分用()括起来。
每组数据只有一个纯小数,也就是整数部分为0。小数的位数不超过9位,循环部分用()括起来。
Output
对每一个对应的小数化成最简分数后输出,占一行。
Sample Input
3
0.(4)
0.5
0.32(692307)
Sample Output
4/9
1/2
17/52
#AC码
#include<stdio.h>
#include<string.h>
#include<math.h>
int doo,moo;
int sea(char *s,int len) //提出数字
{
int m=0;
for(int i=0;i<len;i++)
m+=pow(10,len-i-1)*(s[i]-'0');
return m;
}
int pb(long int a,long int b) //辗转相除
{
long int c;
while(c=a%b)
{
a=b;
b=c;
}
return b;
}
void display()
{
int x=pb(doo,moo);
moo/=x;
doo/=x;
printf("%d/%d\n",moo,doo);
}
int main()
{
char num[15];
int n;
scanf("%d",&n);
getchar();
while(n--)
{
doo=0;
moo=0;
scanf("%s",num); //不能用gets,会造成Runtime Error
char* bra=NULL;
char* point=strchr(num,'.');
if((bra=strchr(num,'('))==NULL)
{
int len=strlen(point+1);
doo=pow(10,len);
moo=sea(point+1,len);
display();
}
else
{
int len1=strlen(point+1)-strlen(bra); //不循环部分
int len2=strlen(bra+1)-1; //循环部分
if(len1==0)
{
moo=sea(bra+1,len2);
for(int i=0;i<len2;i++)
doo+=9*pow(10,i);
display();
}
else
{
int aa=sea(point+1,len1);
int bb=sea(bra+1,len2);
moo=aa*pow(10,len2)+bb-aa;
for(int i=0;i<len2;i++)
doo+=9*pow(10,i);
doo*=pow(10,len1);
display();
}
}
}
}