POJ 1079 : Ratio - 分数逼近

来源:互联网 发布:java 自定义属性 编辑:程序博客网 时间:2024/05/24 04:07

题意:题意一目了然吧~分母从1到max,进行逼近

解法一:

#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
int main(){
int i,p,q,pt,a,b;
while(~scanf("%d%d",&a,&b)){
p=1;
q=0;
for(i=1;i<=b;i++){
pt=(int)((double)(i*a)/(double)b+0.5);
if(q*abs(a*i-b*pt)<i*abs(a*q-b*p)){
p=pt;
q=i;
printf("%d/%d\n",p,q);
}
if(a*q==b*p) break;
}
puts("");
}
return 0;
}


解法二:
用分数套模板  ——  参考http://www.cnblogs.com/jiaohuang/archive/2010/09/18/1830434.html

代码
#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;

typedef long long INT;
typedef struct{ // num/den
INT num,den;
}frac;


int gcd(INT a,INT b){
INT t;
if (a<0)
a=-a;
if (b<0)
b=-b;
if (!b)
return a;
while (t=a%b)
a=b,b=t;
return b;
}

void simplify(frac& f){ //simplify
int t;
if (t=gcd(f.num,f.den))
f.num/=t,f.den/=t;
else
f.den=1; //num=0
}

frac f(INT n,INT d,INT s=1){ //init fraction
frac ret;
if (d<0)
ret.num=-n,ret.den=-d;
else
ret.num=n,ret.den=d;
if (s)
simplify(ret);
return ret;
}

int fraqcmp(frac a,frac b){
int g1=gcd(a.den,b.den),g2=gcd(a.num,b.num);
if (!g1||!g2)
return 0;
return b.den/g1*(a.num/g2)-a.den/g1*(b.num/g2);
}

frac add(frac a,frac b){
INT g1=gcd(a.den,b.den),g2,t;
if (!g1)
return f(1,0,0);
t=b.den/g1*a.num+a.den/g1*b.num;
g2=gcd(g1,t);
return f(t/g2,a.den/g1*(b.den/g2),0);
}

frac sub(frac a,frac b){
return add(a,f(-b.num,b.den,0));
}

void printfra(frac a){
printf("%INTd/%INTd\n",a.num , a.den);
}

int main(){
frac fra_a , fra_t1, dis , fsub;
int na, nb;
while( scanf("%d %d",&na,&nb) != EOF)
{
fra_a = f(na, nb , 1);
dis.den = 1;
dis.num = floor(fra_a.num * ( (double)(1 ) / fra_a.den) + 0.5);
printfra( dis );
dis = sub(fra_a , dis);
if(dis.num < 0 )dis.num = -dis.num;

for(int i=2 ; i<fra_a.den ; i++)
{
fra_t1.den = i;
fra_t1.num =floor( fra_a.num *( (double)( i ) / fra_a.den) + 0.5);

INT ret ;
fsub = sub(fra_t1, fra_a);
if(fsub.num < 0)fsub.num = -fsub.num;

ret = fraqcmp(dis , fsub);
if( ret > 0)
{
printfra(fra_t1);
dis = fsub;
}

}
printfra(fra_a);
puts("");
}
return 0;
}



0 0
原创粉丝点击