HDOJ1717 小数化分数2

来源:互联网 发布:知合控股有限公司 编辑:程序博客网 时间:2024/05/17 02:16
小数化分数2
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u
Description
Ray 在数学课上听老师说,任何小数都能表示成分数的形式,他开始了化了起来,很快他就完成了,但他又想到一个问题,如何把一个循环小数化成分数呢? 
请你写一个程序不但可以将普通小数化成最简分数,也可以把循环小数化成最简分数。 
 
Input
第一行是一个整数N,表示有多少组数据。 
每组数据只有一个纯小数,也就是整数部分为0。小数的位数不超过9位,循环部分用()括起来。 
 
Output
对每一个对应的小数化成最简分数后输出,占一行。
 
Sample Input
3
0.(4)
0.5
0.32(692307)
        
Sample Output
4/9
1/2
17/52 

小数(除了无限不循环小数外)都可以化成分数。
1.将有限小数化成分数,方法如下:0.25 * 100 = 25;0.25 = 25 / 100(约分即可得到0.25的小数表示);
2.将循环小数化成分数,方法如下:
0.32(692307) * 100 = 32.692307①;
0.32(692307) * 10 ^ 8 = 32692307.(692307)②;
② - ①得:0.32(692307)* (10 ^ 8 - 100) = 32692275;
0.32(692307) =  32692275 / (10 ^ 8 - 100)(约分即可得到0.32(692307)的小数形式)。
#include<iostream>#include<cstdio>#include<algorithm>#include<vector>#include<cmath>#include<set>using namespace std;typedef long long ll;typedef vector<int> vi;typedef set<int> si;char str[50];
void gcd(int& mol,int& den){    int t,x=mol,y=den;    while(x>0)    {        t=x;        x=y%x;        y=t;    }    mol/=y;    den/=y;}
int getint(char* str,int pos){    int num=0;    for(int i=2; i<=pos+1; i++)        num=num*10+str[i]-48;    return num;}
int main(){    int n,cnt;    cin>>n;    while(n--)    {        cnt=0;        cin>>str;        int i=0,pos;        while(str[i]!='\0'&&str[i]!='(')            i++;        if(str[i]=='\0')        {            int mol=getint(str,i-2);            int den=pow(10.0,i-2);            gcd(mol,den);            cout<<mol<<'/'<<den<<endl;        }        else        {            int k=i-1;            pos=i;            while(str[k]!='\0')            {                k++;                str[k]=str[k+1];            }            while(str[i]!=')')            {                cnt++;                i++;            }            str[i]='\0';            int num1=getint(str,pos+cnt-2);            int num2=getint(str,pos-2);            int mol=num1-num2;            int den=pow(10.0,pos-2)*(pow(10.0,cnt)-1);            gcd(mol,den);            cout<<mol<<'/'<<den<<endl;        }    }    return 0;}

 原文
1 0
原创粉丝点击