您的位置:首页 > 其它

POJ - 1930 Dead Fraction(将小数化为分数)

2017-08-24 11:18 316 查看
   题意:将一个无限循环小数化作分数

   思路:说这是小学奥赛题,反正我是第一次接触到这种方法,以下来自百度百科

   无限小数又分无限循环小数和无限不循环小数,无限循环小数可以化成分数,而无限不循环小数属于无理数,无法化成分数无限循环小数又分纯无限循环小数(就是说,从十分位开始就是循环节,如0.12341234,其中1234为循环节)和混无限循环小数(就是说,十分位还不是循环节,如0.12333333,3为循环节)!!!!!注:在这里,整数部分忽略不记,但在实际运算中必须加上;还有就是纯无限循环小数&混无限循环小数,这里“纯”和“混”是加上去的,可能这种说法不正确,所以不要随便说,但理解就好先说纯无限循环小数,化成分数,分子就是循环节,而分母,就是循环节是N位,那分母就是N个9(这里是说99999这样连起来的自然数),如0.12341234,1234循环,循环节个数为4,那化成分数,就是分母为4个9,分子为循环节1234,即1234/9999再说混无限循环小数,化成分数,分子就是小数点后面的非循环节部分和一个循环节连起来的数减去非循环节部分,分母是循环节位数个9和非循环节位数个0连起来,如0.12333333,3循环,分子就是123-12=111,分母是900,即111/900

   这道题并没有告诉循环节是多少,并且让求分母最小的,所以暴力每个循环节

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <math.h>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
using namespace std;
typedef long long ll;
const int MAXN=105;
const int INF=0x3f3f3f3f;
char s[MAXN];
//欧几里得求最大公因数
int gcd(int x,int y)
{
if(x<y) swap(x,y);
return y==0? x : gcd(y,x%y);
}
//快速幂
int q_pow(int a,int b)
{
int r=1,base=a;
while(b){
if(b&1) r*=base;
base*=base;
b>>=1;
}
return r;
}
int main(void)
{
while(scanf("%s",s)!=EOF&&strcmp(s,"0"))
{
int all=0,cnt1=0;
int len=strlen(s);
for(int i=2;i<len-3;i++,cnt1++)
all=all*10+s[i]-'0';
//all为 非循环节和循环节连起来的数
int mina=INF,minb=INF; //所求的分子与分母
for(int num=all/10,cnt2=cnt1-1;cnt2>=0;num/=10,cnt2--)
{
//num为非循环节部分连起来的数 ,a为当前循环节下的分子,b为当前循环节下的分母
int a=all-num,b=q_pow(10,cnt2)*(q_pow(10,cnt1-cnt2)-1);
int g=gcd(a,b);
//求出分母最小的
if(b/g<minb)
{
minb=b/g;
mina=a/g;
}
}
printf("%d/%d\n",mina,minb);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj 1930