POJ - 1930 Dead Fraction(简单数学推理)
2017-08-17 09:45
471 查看
题目描述:
点击打开链接
点击打开链接
题意给你一个无限循环小数,求一个最小的精确分数。
这又是一道重在推理的题,假设存在一个分数0.abcdefg...小数点一共7位,我们可以把这7位分开来看,假设k+c=7,并且x/y=0.abcdefg...我们可以写出下面两个式子x/y*10^(k+c)=abcdefg. ...,x/y*10^k=abcde.fg...,将两个式子相减得到x/y*(10^(k+c)-10^k)=abcdefg-abcde.fg,移项x/y=(abcdefg-abcde.fg)/(10^(k+c)-10^k)不难发现我们现在其实就可以求出一组x,y了,所以我们只需要枚举k,求出每一组对应的x,y找到y最小的一组即可。
AC代码:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<string> #include<stack> #include<queue> #include<algorithm> using namespace std; const int MOD=21252; string s; int qpow(int x,int y) { int res=1; while(y) { if (y&1) res=res*x; x=x*x; y=y>>1; } return res; } int gcd(int x,int y) { return y==0? x:gcd(y,x%y); } int main() { while(cin>>s) { if (s=="0") break; // int len=s.size(); int mina,minb; mina=minb=0x3f3f3f3f; int l=0; int all=0; for (int i=2;s[i]!='.';i++) { all=all*10+s[i]-'0'; l++; } // printf("%d...\n",l); int num=all; int k=1; for (int i=1;i<=l;i++) { num=num/10; k=k*10; int a=all-num; int b=qpow(10,l-i)*(k-1); // printf("%d...\n",a); int j=gcd(a,b); if (b/j<minb) { mina=a/j; minb=b/j; } } printf("%d/%d\n",mina,minb); } return 0; }
相关文章推荐
- POJ 1930 Dead Fraction【数学】
- poj 1930 Dead Fraction 数学 分数 无限循环小数
- POJ - 1930 Dead Fraction(数学精度计算)
- POJ 1930 - Dead Fraction(数学)
- POJ - 1930 Dead Fraction 无限循环小数化分数(数学小知识)
- POJ - 1930 Dead Fraction(将小数化为分数)
- POJ 1930 Dead Fraction (无限循环小数转化为分数)
- POJ -1930 Dead Fraction (GCD+循环小数化分数)
- POJ 1930 Dead Fraction (小数化分数)
- POJ 1930 Dead Fraction 笔记
- POJ 1930 Dead Fraction(循环小数化分数)
- POJ 1930 Dead Fraction(小数化分数)
- POJ 1930 Dead Fraction
- Mathematics:Dead Fraction(POJ 1930)
- POJ 1930 Dead Fraction (循环小数-GCD)
- POJ 1930 Dead Fraction(循环小数转换成分数)
- POJ 1930 Dead Fraction 数论
- POJ 1930 Dead Fraction
- POJ-1930-Dead Fraction
- poj 1930 Dead Fraction 混循环小数化分数 数论