zoukankan      html  css  js  c++  java
  • hdu 1717

    小数化分数2

    Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3037    Accepted Submission(s): 1237

    Problem 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
     
    Source
     
    Recommend
    lcy
     
    题解:首先要知道无限循环小数分数形式的构造方法:分子为最小循环节,分母为对应位数的99..9 如已知无限循环小数:0.568568……以568为循环节,那么这个小数的分数形式就是568/999,题中,我们将小数的有限部分和无限循环部分分开处理,得到两个分数,再相加化简,所得即为所求。
      1 #include<iostream>
      2 #include<cstring>
      3 #include<cstdlib>
      4 #include<cstdio>
      5 #include<algorithm>
      6 #include<cmath>
      7 #include<queue>
      8 #include<map>
      9 
     10 #define N 1010
     11 #define M 15
     12 #define mod 1000000007
     13 #define mod2 100000000
     14 #define ll long long
     15 #define maxi(a,b) (a)>(b)? (a) : (b)
     16 #define mini(a,b) (a)<(b)? (a) : (b)
     17 
     18 using namespace std;
     19 
     20 int T;
     21 char s[N];
     22 int f1,f2;
     23 
     24 ll gcd(ll x,ll y)
     25 {
     26     if(y==0)
     27         return x;
     28     return gcd(y,x%y);
     29 }
     30 
     31 int main()
     32 {
     33     int i;
     34     //freopen("data.in","r",stdin);
     35     scanf("%d",&T);
     36     getchar();
     37     //for(int cnt=1;cnt<=T;cnt++)
     38     while(T--)
     39     //while(scanf("%d%d",&n,&q)!=EOF)
     40     {
     41         scanf("%s",s);
     42        // getchar()
     43         //printf(" %s
    ",s);
     44         int l=strlen(s);
     45         int flag=0;
     46         f1=f2=0;
     47         ll x1;
     48         ll a,x;
     49         ll b=0;
     50         ll te;
     51         a=0;
     52         x1=1;
     53         x=1;
     54         ll g1,g2;
     55         ll y;
     56         for(i=2;i<l;i++){
     57             if(flag==0)
     58             {
     59                 if(s[i]!='('){
     60                     f1=1;
     61                     x1*=10;
     62                     b*=10;
     63                     b+=s[i]-'0';
     64                 }
     65                 else{
     66                     flag=1;
     67                     f2=1;
     68                 }
     69             }
     70             else{
     71                 if(s[i]!=')'){
     72                     x*=10;
     73                     a*=10;
     74                     a+=s[i]-'0';
     75                 }
     76             }
     77            // printf("   %d %d %I64d %I64d %I64d %I64d
    ",i,flag,b,x1,a,x);
     78         }
     79         //printf("   %d %d %I64d %I64d %I64d %I64d
    ",f1,f2,b,x1,a,x);
     80        te=1;
     81        if(f1==1){
     82             g1=gcd(b,x1);
     83             if(g1!=0){
     84                 b/=g1;
     85                 te=x1;
     86                 x1/=g1;
     87             }
     88        }
     89 
     90         if(f2==1){
     91             y=x-1;
     92             y*=te;
     93             g2=gcd(a,y);
     94             if(g2!=0){
     95                 a/=g2;
     96                 y/=g2;
     97             }
     98         }
     99 
    100 
    101 
    102         //printf(" %d %d %d %d
    ",b,x1,a,y);
    103         //printf("   %d %d %I64d %I64d %I64d %I64d
    ",f1,f2,b,x1,a,y);
    104         if( (f1+f2)==2){
    105            // y*=x1
    106 
    107             ll c=(x1*a+y*b);
    108             ll d=y*x1;
    109             // printf(" %I64d/%I64d
    ",c,d);
    110             ll g3=gcd(c,d);
    111             if(g3!=0){
    112                 c/=g3;
    113                 d/=g3;
    114             }
    115             printf("%I64d/%I64d
    ",c,d);
    116         }
    117         else{
    118             if(f1==1)
    119                 printf("%I64d/%I64d
    ",b,x1);
    120             else
    121                 printf("%I64d/%I64d
    ",a,y);
    122         }
    123 
    124 
    125 
    126 
    127 
    128 
    129     }
    130 
    131     return 0;
    132 }
  • 相关阅读:
    渚漪Day18——JavaWeb 09【JSP】
    渚漪Day17——JavaWeb 08【Session】
    渚漪Day16——JavaWeb 07【Cookie】
    渚漪Day15——JavaWeb 06【HTTPServletRequest】
    渚漪Day14——JavaWeb 05【HTTPServletResponse】
    Typora编写markdown 常用入门
    Vue 笔记
    ABCNN 学习笔记
    DSSM 学习笔记
    支持向量机 SVM 学习笔记
  • 原文地址:https://www.cnblogs.com/njczy2010/p/3915718.html
Copyright © 2011-2022 走看看