zoukankan      html  css  js  c++  java
  • HDU 1717 小数化分数2(最大公约数)

    小数化分数2

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


    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   |   We have carefully selected several similar problems for you:  1715 1716 1166 1719 1722 
     
    有限小数很简单,无限小数的化法是利用了无限小数循环的性质,把利用倍数关系去掉无穷部分。 
    以0.94(375)为例子。 
    现将他乘100,变为94.(375)。 
    然后在取他的100000倍,变为94375.(375) 
    这样两个数小数点后相同,相减后就变为整数了。 
    以x代表原数; 
    100000x-100x=94375.(375)-94.(375)=94281 
    99900x=94281 
    x=94281/99900 
    好了这样就做出来了, 
    剩下的就是基础的字符串操作。 
     
     1 #include <iostream>
     2 #include <cstring>
     3 #include <string>
     4 #include <algorithm>
     5 #include <cmath>
     6 using namespace std;
     7 int gcd(int a, int b)
     8 {
     9     return b == 0 ? a : gcd(b, a%b);
    10 }
    11 int main()
    12 {
    13     int n;
    14     cin >> n;
    15     char a[15];
    16     while (n--)
    17     {
    18         cin >> a;
    19         int l = strlen(a);
    20         int i;
    21         int k = 0;
    22         int in = 0;//不循环的有几位
    23         bool yk = 0;//是否有循环
    24         int ans = 0;//总的部分
    25         int dec = 0;//不循环部分
    26         for (i = 2; i < l; i++)
    27         {
    28             if (!yk&&a[i] >= '0'&&a[i] <= '9')
    29             {
    30                 in++;
    31             }
    32             if (a[i]== '(')
    33             {
    34                 yk = 1;
    35             }
    36             if (yk&&a[i] >= '0'&&a[i] <= '9')
    37             {
    38                 k++;
    39             }
    40         }
    41 
    42         for (i = 2; i <= in + 1; i++)//不循环部分先化为整数部分
    43         {
    44             dec = dec*10 + (a[i] - '0');
    45         }
    46         if (!yk)//没有循环的话直接,比如0.5,dec=5,ll=10,答案为1/2
    47         {
    48             int ll =(int) pow(10, in);
    49             int x = gcd(dec, ll);
    50             cout << dec / x << "/" << ll/ x << endl;
    51         }
    52         else
    53         {//循环的话,举例0.32(692307)
    54             for (i = 2; i < l; i++)
    55             {
    56                 if (a[i] >= '0'&&a[i] <= '9')
    57                 {
    58                     ans = ans*10 + (a[i] - '0');
    59                 }
    60             }
    61             l = l - 4;
    62             ans = ans - dec;//对于该例子ans=32692307-32
    63             int ll = (int)pow(10, l);
    64             int lll = (int)pow(10, in);
    65             ll = ll - lll;//对于该例子ll=100000000-100
    66             int x = gcd(ans, ll);
    67             cout << ans / x << "/" << ll/ x << endl;
    68         }
    69     }
    70     return 0;
    71 }
  • 相关阅读:
    Vue中axios基础使用(一)_前端前端请求数据
    vue中使用font-awesome
    vue-cli 搭建项目中,img引用资源404
    前端工程化常用的基础lunix命令
    vue运行项目时network显示unavailable
    关于vue中node_modules中第三方模块的修改使用
    tableau extension 调研
    使用 certbot 自动给 nginx 加上 https
    前端常用:复制到剪切板和下载
    ssh 的一个坑
  • 原文地址:https://www.cnblogs.com/caiyishuai/p/8453186.html
Copyright © 2011-2022 走看看