Dead Fraction POJ 1930(数学)

原题

题目链接

题目分析

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

代码

 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 }

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

时间: 2024-11-13 06:42:17

Dead Fraction POJ 1930(数学)的相关文章

POJ 1930 Dead Fraction

POJ 1930 Dead Rraction 此题是一个将无限循环小数转化为分数的题目 对于一个数 x=0.abcdefdef.... 假设其不循环部分的长度为m(如abc的长度为m),循环节的长度为n(def的长度为n),此时的主要目的是消除后面的循环部分, x*10^(m+n)=abcdef.defdef...        x*10^n=     abc.defdef.. 通过比较两式,做减法可消除循环部分· x*10^n*(10^m-1)=abcdef-abc(整数) x=(abcdef

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

uva 10555 - Dead Fraction)(数论)

题目链接:uva 10555 - Dead Fraction 题目大意:给出一个小数,从...开始可以是任何数字,但是保证是无限循环小数,将该小数用分式的形式表示,并且要求分母尽量大. 解题思路:这题主要是怎么将无限循环小数转换成分式,这样的: 有小数0.abcdEEE,未循环部分长4,循环节为E,E的长度为i(假设) abcd+E999-(i位9)10i #include <cstdio> #include <cstring> #include <algorithm>

POJ 2906 数学期望

开始时直接设了一个状态,dp[i][j]为发现i种bug,j个系统有bug的期望天数.但很错误,没能转移下去.... 看了题解,设状态dp[i][j]为已发现i种bug,j个系统有bug,到完成目标状态所需要的期望的天数.妙啊,这样一设状态,就很好更解了.如,由dp[i][j] 可以到达状态dp[i][j+1],则到达它的概率很明显可求出为p=(i/n)*((s-j)/s),则是,需要dp[i][j+1](期望)天数的概率就是p.这就很容易理解了啊,高!高!高! 由dp[i][j]可以转移出四个

《算法竞赛入门经典——训练指南》第二章题库

UVa特别题库 UVa网站专门为本书设立的分类题库配合,方便读者提交: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=442 注意,下面注有"extra"的习题并没有在书中出现,但在上面的特别题库中有,属于附加习题. 基础练习 (Basic Problems) UVa11388 GCD LCM UVa11889 Benefit UVa10943 How do y

【数论】辗转相除法

AOJ 0005 题目是英文的,我就不具体翻译了.就是求最大公约数和最小公倍数. (补充下 设两个数是a,b最大公约数是p,最小公倍数是q那么有这样的关系:ab=pq所以q=ab/p) #include<iostream> #include<cstdio> using namespace std; int gcd(int a,int b) { if(b==0) return a; return gcd(b,a%b); } int lcm(int a,int b) { return

合并数组对象中相同的属性值

面试题中往往会遇到这样的笔试题,将以下数组对象合并相同值 var arr = [{ "name": "语文", "fraction": 80 }, { "name": "数学", "fraction": 70 }, { "name": "语文", "fraction": 50 }, { "name": &qu

log函数的易混点

一.log函数 头文件: #include <math.h> 使用: 引入#include<cmath> 以e为底:log(exp(n)) 以10为底:log10(n) 以m为底:log(n)/log(m) 重点:log()与log10()不是相同的函数double log(double x);  /* 计算一个数字的自然对数 */double log10(double x);  /* 计算以10为基数的对数 */ 引申: lg(1*2*3*4*5*...)=lg1+lg2+lg3

POJ 3340 &amp; HDU 2410 Barbara Bennett&#39;s Wild Numbers(数学)

题目链接: PKU:http://poj.org/problem?id=3340 HDU:http://acm.hdu.edu.cn/showproblem.php?pid=2410 Description A wild number is a string containing digits and question marks (like 36?1?8). A number X matches a wild number W if they have the same length, and