HDU2.1.8 小数化分数2

来源:互联网 发布:gta5画面设置优化 编辑:程序博客网 时间:2024/05/31 04:03

分成三种情况来讨论:

(1)只有普通小数

(2)只有循环小数

(3)前面是普通小数,后面跟着循环小数

把普通小数的位数num和循环小数位数(即为括号中的数字个数)cir_num统计出来

对于情况(1),就是把小数表示的数字除以对应的10的次方,比如0.32对应32/(10^2)

对于情况(2),就是把小数表示的数字除以对应的10的次方减1,比如0.(32)对应32/(10^2-1)

对于情况(3),就是把情况(1)加上1/10``0乘以情况(2),比如0.3(32)对应3/10+1/10*(32/(10^2-1))

代码如下:

#include <cstdio>#include <iostream>#include <cmath>#include <cstring>using namespace std;char fra[20];long long pow10(int n){long long res=1;for(int i=1;i<=n;i++)res*=10;return res;}long long change(int a,int b){long long res=0;for(int i=a;i<=b;i++)res=res*10+(fra[i]-'0');return res;}long long gcd(long long a,long long b){if(a<b){long long t=a;a=b;b=t;}while(b!=0){long long c=a%b;a=b;b=c;}return a;} int main(){int T;scanf("%d",&T);getchar();while(T--){memset(fra,0,sizeof(fra));scanf("%s",fra);int num=0;int cir_num=0;int flag=0;int i,j;for(i=2;fra[i]!=0;i++){if(fra[i]=='('){flag=1;break;}num++;}if(flag){for(j=i+1;fra[j]!=')';j++){cir_num++;}}long long down;long long up;if(num==0){down=pow10(cir_num)-1;up=change(i+1,j-1);}else if(cir_num==0){down=pow10(num);up=change(2,i-1);}else{down=pow10(num)*(pow10(cir_num)-1);up=change(2,i-1)*(pow10(cir_num)-1)+change(i+1,j-1);}long long temp=gcd(down,up);if(temp!=1){down/=temp;up/=temp;}printf("%lld/%lld\n",up,down);}return 0;}


0 0
原创粉丝点击