POJ 1079 Ratio

問題

A/Bという分数が与えられる。
この分数に対して、次のような分数列を求めよ。

  • 分母が前の分数より常に大きい
  • 前の分数よりもA/Bに対する良い近似を与える
  • 項数が最大
  • 近似が同じ分子が二通りある場合、分子の大きいほうを採用する


例えばA=5, B=4の場合、
1/1
4/3
5/4
のような列である。

制約条件

A,B≦5000

方針

分母を1からBまで動かし、それぞれの分母について最良の近似を与える分子を探し、
それが今までの最良の近似より良くなっているなら出力する。


分子を見つける部分は、しゃくとり法っぽく1ずつ増やしていくことができる。

ソースコード

int a,b;

int main()
{
	while(~scanf("%d%d",&a,&b)){
		double mn=INF;
		for(int d=1, n=0;d<=b;d++){
			while(abs((n+1.0)/d-a*1.0/b)<abs(n*1.0/d-a*1.0/b)+EPS)n++;
			if(mn>abs(n*1.0/d-a*1.0/b)+EPS){
				printf("%d/%d\n",n,d);
				mn=abs(n*1.0/d-a*1.0/b);
			}
		}
		puts("");
	}
	return 0;
}