码迷,mamicode.com
首页 > 其他好文 > 详细

Dead Fraction POJ 1930(数学)

时间:2019-08-31 10:49:08      阅读:82      评论:0      收藏:0      [点我收藏+]

标签:name   mic   int   sof   cti   表示   div   rac   algorithm   

原题

题目链接

题目分析

无限循环小数化分数.把小数用分数表示,后面等比数列可以用求和公式化简,最后可以总结出一个通用公式(可以百度),这里不细讲.需要注意一下,题目没有明确说明循环部分从哪开始,因此需要枚举循环部分,找到分母最小的输出即可.

代码

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <utility>
 4 #include <cstdio>
 5 #include <cstdlib>
 6 #include <ctime>
 7 #include <cmath>
 8 #include <cstring>
 9 #include <string>
10 #include <vector>
11 #include <stack>
12 #include <queue>
13 #include <map>
14 #include <set>
15 
16 using namespace std;
17 typedef long long LL;
18 const int INF_INT=0x3f3f3f3f;
19 const LL INF_LL=0x3f3f3f3f3f3f3f3f;
20 
21 string s;
22 LL num[20];
23 
24 LL gcd(LL a,LL b)
25 {
26     return b?gcd(b,a%b):a;
27 }
28 
29 int main()
30 {
31 //    freopen("stdin.in","r",stdin);
32 //    freopen("stdout.out","w",stdout);
33     while(cin>>s)
34     {
35         if(s.size()==1) break;
36         int cnt=0;
37         for(int i=2;i<s.size();i++)
38             if(s[i]!=.) num[cnt++]=s[i]-0;
39         LL ans,res,minn=INF_LL;
40         LL unrepeat,repeat,urpten,rpten,up,down;
41         for(int i=0;i<cnt;i++)
42         {
43             unrepeat=repeat=0;
44             urpten=rpten=1;
45             for(int j=i-1;j>=0;j--) unrepeat+=num[j]*urpten,urpten*=10;
46             for(int j=cnt-1;j>=i;j--) repeat+=num[j]*rpten,rpten*=10;
47 
48             up=unrepeat*rpten+repeat-unrepeat;
49             down=urpten*(rpten-1);
50 
51             LL g=gcd(up,down);
52             up/=g,down/=g;
53 
54             if(down<minn) ans=up,res=down,minn=down;
55         }
56         printf("%lld/%lld\n",ans,res);
57     }
58     return 0;
59 }

 

Dead Fraction POJ 1930(数学)

标签:name   mic   int   sof   cti   表示   div   rac   algorithm   

原文地址:https://www.cnblogs.com/VBEL/p/11438102.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!