博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
无限循环小数POJ1930
阅读量:5276 次
发布时间:2019-06-14

本文共 1397 字,大约阅读时间需要 4 分钟。

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

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

     (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 
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 #include
10 #include
11 #include
12 #include
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<
<<"/"<
<
View Code

 

转载于:https://www.cnblogs.com/wolf940509/p/5792439.html

你可能感兴趣的文章
简单的网页发邮件例子
查看>>
打印机打印字符串转字节数组截取半个中文导致的乱码问题
查看>>
Android自定义组合控件:UIScrollLayout(支持界面滑动及左右菜单滑动)
查看>>
yii_wiki_145_yii-cjuidialog-for-create-new-model (通过CJuiDialog来创建新的Model)
查看>>
庖丁解“学生信息管理系统”
查看>>
Pyltp使用
查看>>
Android中ListView嵌套GridView的简单消息流UI(解决宽高问题)
查看>>
CentOS 6.5 安装 apache php myslq
查看>>
iOS的大概念 -- iOS是Apple应用开发和运行的基石
查看>>
bzoj1009: [HNOI2008]GT考试
查看>>
数论某些题目
查看>>
Storm Topology Parallelism
查看>>
MySQL存储过程详解 mysql 存储过程
查看>>
Star sky 二维前缀和
查看>>
准程序员也注定孤独一生吗?
查看>>
第二十七篇:goto语句
查看>>
uTTY Secure Copy client Windows 文件同步工具
查看>>
计算机组成体系结构总览
查看>>
C++11语法糖
查看>>
乐理学习
查看>>