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-abc)/(10^(m+n)-10^n);

     设 s=abcdef-abc,t=10^(m+n)-10^n;

      此题转化为求h=gcd(s,t);

      最后x=(s/h)/(t/h) 即为所求不可约分数

      

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <vector>
#include <map>
#include <set>
#include <string>
#include <cmath>
using namespace std;
const int INF=0x3f3f3f3f;
typedef long long ll;
int gcd(int n,int m)//求最大公约数
{
    if(m==0) return n; //n%m==0(n与m的余数为0)
    return gcd(m,n%m);(n是大数,m是小数)
}
int main()
{
    int all,num,l,m,n,a,b,k,mis,mns;
    char str[100];
    while(gets(str)&&strcmp(str,"0"))
    {
        l=0;all=0;mis=INF;
        for(int i=2;str[i]!=‘.‘;i++)
        {
            all=all*10+str[i]-48;
            l++;
        }
        num=all;
        for(int j=1;j<=l;j++)
        {
            num=num/10;
            a=all-num;
            b=(int)pow(10,l-j)*(pow(10,j)-1);
            k=gcd(b,a);
            if(b/k<mis)
            {
                mns=a/k;
                mis=b/k;
            }
        }
        printf("%d/%d\n",mns,mis);
    }
    return 0;
}
时间: 2024-10-27 12:14:05

POJ 1930 Dead Fraction的相关文章

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>

Dead Fraction POJ 1930(数学)

原题 题目链接 题目分析 无限循环小数化分数.把小数用分数表示,后面等比数列可以用求和公式化简,最后可以总结出一个通用公式(可以百度),这里不细讲.需要注意一下,题目没有明确说明循环部分从哪开始,因此需要枚举循环部分,找到分母最小的输出即可. 代码 1 #include <iostream> 2 #include <algorithm> 3 #include <utility> 4 #include <cstdio> 5 #include <cstdl

【数论】辗转相除法

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

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

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

ZOJ 1718 POJ 2031 Building a Space Station 修建空间站 最小生成树 Kruskal算法

题目链接:ZOJ 1718 POJ 2031 Building a Space Station 修建空间站 Building a Space Station Time Limit: 2 Seconds      Memory Limit: 65536 KB You are a member of the space station engineering team, and are assigned a task in the construction process of the statio

POJ 2704 Pascal&#39;s Travels (基础记忆化搜索)

Pascal's Travels Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5328   Accepted: 2396 Description An n x n game board is populated with integers, one nonnegative integer per square. The goal is to travel along any legitimate path from t

poj 2418 Hardwood Species(二叉排序树)

Hardwood Species Time Limit: 10000MS Memory Limit: 65536K Total Submissions: 19428 Accepted: 7658 http://poj.org/problem?id=2418 Description Hardwoods are the botanical group of trees that have broad leaves, produce a fruit or nut, and generally go d

[字典树] poj 2418 Hardwood Species

题目链接: http://poj.org/problem?id=2418 Hardwood Species Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 17511   Accepted: 6949 Description Hardwoods are the botanical group of trees that have broad leaves, produce a fruit or nut, and gene