HDU1717(小数化分数,思维数学题)

来源:互联网 发布:杭州 政府网站 建站 编辑:程序博客网 时间:2024/04/30 11:51

orz大佬,循环小数化分数
有限小数很简单,无限小数的化法是利用了无限小数循环的性质,把利用倍数关系去掉无穷部分。
以0.94(375)为例子。
现将他乘100,变为94.(375)。
然后在取他的100000倍,变为94375.(375)
这样两个数小数点后相同,相减后就变为整数了。
以x代表原数;
100000x-100x=94375.(375)-94.(375)=94281
99900x=94281
x=94281/99900
好了这样就做出来了,
剩下的就是基础的字符串操作。
ac code:

#include<stdio.h>#include<string.h>#include<math.h>#include<algorithm>#include<iostream>#include<string>#include <set>#include<time.h>//a&3==a%4using namespace std;#define ll long long#define mem(a) memset(a,0,sizeof(a))const double eps=1e-8;const int maxn=30010;//须填写const int inf=0x3f3f3f3f;int tenpow[20];init(){    tenpow[0]=1;    for(int i=1;i<20;i++)        tenpow[i]=tenpow[i-1]*10;}int gcd(int x,int y){    return y==0?x:gcd(y,x%y);}char num[50];bool judge(){    for(int i=0;i<strlen(num);i++)    {        if(num[i]=='(')            return false;    }    return true;}int getnum(){    int res=0;    for(int i=2;i<strlen(num);i++)        res=(res*10+(num[i]-'0'));    return res;}int uncursearch(int &b){    int res=0;    for(int i=2;i<strlen(num);i++)    {        if(num[i]=='(')        {            break;        }        else        {            b++;            res=res*10+(num[i]-'0');        }    }    return res;}int cursearch(int &b){    int res=0;    int i=0;    while(i<strlen(num))    {        if(num[i]=='('&&num[i]!=')')        {            while(true)            {                i++;                if(num[i]==')')                    break;                res=res*10+(num[i]-'0');                b++;            }        }        i++;    }    return res;}int main(){    init();    int kase;    int fenzi;    int fenmu;    scanf("%d",&kase);    while(kase--)    {        scanf("%s",num);        if(judge())        {            fenzi=getnum();            fenmu=tenpow[strlen(num)-2];        }        else{            int curdigit=0;            int uncurdigit=0;            int curnum=cursearch(curdigit);            int uncurnum=uncursearch(uncurdigit);            fenzi=uncurnum*tenpow[curdigit]+curnum-uncurnum;            fenmu=tenpow[curdigit+uncurdigit]-tenpow[uncurdigit];            //printf("%d    %d     %d     %d\n",curdigit,uncurdigit,curnum,uncurnum);        }        int numgcd=gcd(fenzi,fenmu);        fenzi/=numgcd;        fenmu/=numgcd;        printf("%d/%d\n",fenzi,fenmu);    }    return 0;}
原创粉丝点击