HDU解题报告——1717

来源:互联网 发布:java系统设计文档 编辑:程序博客网 时间:2024/05/18 00:43

  颇为闹心的一道题,首先是一些关于循环小数化分数的知识,假设循环部分有n位,从小数点后第m位开始,则化为分数就是循环部分/(n个9*10^(m-1)),(假设循环前都是0),那么这一题就是构造出来循环和非循环部分约分相加就好了,另外调用scanf()和printf()函数的时候要用%_I64d,顺道给个WA的数据:0.0(1),答案应该是1/90,代码如下:

#include <iostream>#include <cstring>#include <cmath>#include <cstdio>using namespace std;long long gcd(long long a,long long b){long long r=1;while(r){r=a%b;a=b;b=r;}return a;}long long lcm(long long a,long long b){return a/gcd(a,b)*b;}int main(){int t;cin>>t;while(t--){char num[100]={0};cin>>num;bool mark=false;int sizex=0,sizenx=0;long long x=0,nx=0;for(int i=2;num[i]!='\0';i++){if(num[i]=='(') {num[strlen(num)-1]='\0';mark=true;continue;}if(!mark){sizenx++;nx=nx*10+num[i]-'0';}else{sizex++;x=x*10+num[i]-'0';}}long long fmx,fmnx,fm=0,fz=0,kx,knx;if(sizex==0){fmnx=(long long)pow(double(10),sizenx);printf("%I64d/%I64d\n",nx/gcd(nx,fmnx),fmnx/gcd(nx,fmnx));}else if(sizenx==0){fmx=0;for(int i=0;i<sizex;i++) fmx=fmx*10+9;printf("%I64d/%I64d\n",x/gcd(x,fmx),fmx/gcd(x,fmx));}else if(nx==0){fmx=0;for(int i=0;i<sizex;i++) fmx=fmx*10+9;for(int i=0;i<sizenx;i++) fmx*=10;printf("%I64d/%I64d\n",x/gcd(x,fmx),fmx/gcd(x,fmx));}else{fmx=0;fmnx=1;for(int i=0;i<sizex;i++) fmx=fmx*10+9;for(int i=0;i<sizenx;i++) {fmx*=10;fmnx*=10;}kx=gcd(fmx,x);knx=gcd(fmnx,nx);fmx/=kx;x/=kx;fmnx/=knx;nx/=knx;fm=lcm(fmnx,fmx);fz=fm/fmnx*nx+fm/fmx*x;printf("%I64d/%I64d\n",fz/gcd(fz,fm),fm/gcd(fz,fm));}}return 0;}


 

0 0
原创粉丝点击