无限循环小数POJ1930

题意:给定一个无限循环小数,求其分数形势,要求分母最小

分析:看了别人的题解才做出来的,将无限循环小数转化成分数,分为纯循环和混循环两种形式。

(1)对于纯循环:用9做分母,有多少个循环数就几个9,比如0.3,3的循环就是9分之3,0.654,654的循环就是999分之654, 0.9,9的循环就是9分之1,以此类推。

(2)混循环:用9和0做分母,首先有几个循环节就几个9,接着有几个没加入循环的数就加几个0,再用小数点后面的数减 没加入循环的数,比如0.43,3的循环,有一位数没加入循环,就在9后面加一个0做分母,再用43减4做分子,得 90分之39,0.145,5的循环就用9后面加2个0做分母,再用145减14做分子,得900分之131,0.549,49的循环,就 用99后面加1个0做分母,用549减5做分子,最后得990分之545,以此类推,能约分的要化简。

本题没有说明循环节在哪一位,因此每一位进行枚举,取分母最小的就是所求 ,注意学会STL中String的用法。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <string>
 5 #include <vector>
 6 #include <algorithm>
 7 #include <set>
 8 #include <map>
 9 #include <bitset>
10 #include <cmath>
11 #include <queue>
12 #include <stack>
13 using namespace std;
14 string s;
15 long long gcd(long long a,long long b)
16 {
17     if(b==0)   return a;
18     return gcd(b,a%b);
19 }
20 int main()
21 {
22     while(cin>>s)
23     {
24         if(s=="0")  break;
25         string digit=s.substr(2,s.length()-5);
26         int n=digit.length();
27         long long m=atoi(digit.c_str());  //小数点后面的数
28         long long fmmin,fzmin;
29         fmmin=1<<30;
30         for(int i=1;i<=n;i++)
31         {
32             string cnt=digit.substr(0,n-i);
33             long long res=m-atoi(cnt.c_str()); //分子
34             long long ans=pow(10,n)-pow(10,n-i);  //分母
35             long long num=gcd(res,ans);
36             res/=num;     //最简形式
37             ans/=num;
38             if(fmmin>ans)
39             {
40                 fmmin=ans;
41                 fzmin=res;
42             }
43         }
44         cout<<fzmin<<"/"<<fmmin<<endl;
45     }
46     return 0;
47 }

时间: 2024-11-09 21:07:36

无限循环小数POJ1930的相关文章

【The beauty of math】无限循环小数转分数

0.333333... = 1/3 推导过程: 设x=0.333333 10x=3.333333(循环体的数字个数为1) 10x-x=3 x=1/3 所以计算的核心在于确定无限循环的循环体的数字个数. [The beauty of math]无限循环小数转分数,布布扣,bubuko.com

UVA 10555 - Dead Fraction(数论+无限循环小数)

UVA 10555 - Dead Fraction 题目链接 题意:给定一个循环小数,不确定循环节,求出该小数用分数表示,并且分母最小的情况 思路:推个小公式 一个小数0.aaaaabbb... 表示为n/m形式,并且a为整数部分有c位, b为小数部分有d位 那么aaaaa.bbb...和aaaaabbb....分别可以表示为10c?(n/m)和10c+d?(n/m) 两式相减得:aaaaabbb?aaaaa=(10c+d?10c)(n/m) 那么设n1 = aaaaabbb ,n2 = aaa

无限循环小数化分数、

循环小数分为混循环小数.纯循环小数两大类. 混循环小数可以*10^n(n为小数点后非循环位数),所以循环小数化为分数都可以最终通过纯循环小数来转化. 等比数列法编辑 无限循环小数,先找其循环节(即循环的那几位数字),然后将其展开为一等比数列.求出前n项和.取极限.化简. 例如:0.333333…… 循环节为3 则0.33333.....=3*10^(-1)+3*10^(-2)+……+3^10(-n)+…… 前n项和为:0.3(1-(0.1)^(n))/(1-0.1) 当n趋向无穷时(0.1)^(

将无限循环小数化为分数

众所周知,有限小数是十进分数的另一种表现形式,因此,任何一个有限小数都可以直接写成十分之几.百分之几.千分之几……的数.那么无限小数能否化成分数? 首先我们要明确,无限小数可按照小数部分是否循环分成两类:无限循环小数和无限不循环小数.无限不循环小数不能化分数,这在中学将会得到详尽的解释:无限循环小数是可以化成分数的.那么,无限循环小数又是如何化分数的呢?由于它的小数部分位数是无限的,显然不可能写成十分之几.百分之几.千分之几……的数.其实,循环小数化分数难就难在无限的小数位数.所以我就从这里入手

如何把一个无限循环小数转换成一个分数(算法)

循环小数如何化分数众所周知,有限小数是十进分数的另一种表现形式,因此,任何一个有限小数都可以直接写成十分之几.百分之几.千分之几……的数.那么无限小数能否化成分数? 首先我们要明确,无限小数可按照小数部分是否循环分成两类:无限循环小数和无限不循环小数.无限不循环小数不能化分数,这在中学将会得到详尽的解释:无限循环小数是可以化成分数的.那么,无限循环小数又是如何化分数的呢?由于它的小数部分位数是无限的,显然不可能写成十分之几.百分之几.千分之几……的数.其实,循环小数化分数难就难在无限的小数位数.

如何将无限循环小数转换为分数

将一个无限循环小数转换为分数 例如: 32.5632323232......... 1.设x=32.5632323232......... 则 y=x*10000 y=325632.32323232..... 2. z=x*100 z=3256.3232323232....... 3. y-z=322376  //注意,这里的小数部分被抵消了 y-z=10000x-100x 也就是9900x=322376 x=322376/9900 然后对分式化简得最简表达式 化简分式可以用辗转相除法求出最大公

一种将无限循环小数快速转换为分数的方法

问题描述: 将任意无限循环小数转换为分数.例如0.121121121........=121/999 算法综述: 前面有一篇博文抱着娱乐态度证明了0.9999...=1 ,证明过程既不严谨.但由此可想到一种将任意无限循环小数快速转为分数的方法. 首先回顾下0.9999...=1 的证明过程: 证明: 令a=0.99999...(无限循环) 则10a=9.99999...(无限循环) 10a-a=9.99999...(无限循环)-0.99999...(无限循环)=9=9a 所以a=1 换汤不换药:

无限循环小数转分数(纯C)

这是以前帮一个哥们做的考研复试题,还是比较有趣的. 首先输入测试数据组数,然后每一组输入的格式为a.b(c),比如: 10 3.1(3) 0.(3) 1.(25) 输出分数形式: 47/15 1/3 124/99 代码和分析如下: #include <stdio.h> #include <string.h> //按照题目条件,设小数是a.b(c)的,比如3.1(3)但是有可能b是空串,比如0.(10) //思路,拿3.1(3)举例:x = 3.1(3) ; 10x = 31.(3)

java基础——java无限循环小数判定问题以及BigDecimal详解

刷题--POJ2395OutofHay 数据结构复习之排序篇 [设计模式]--控制反转模式 虚拟机以及VMwareTools的安装 ukz伦敛中http://p.baidu.com/pai/center?uid=50706162633964366165352aa9&type=2trcgv才烙勒4w9qas疽们纫http://p.baidu.com/pai/center?uid=4f836162636335363466372aa9&type=wfitjf哟糖堆7qspnn氛诺芈http://