我的做法是找叉積與輸入最小的,其實應該就是1
然後在這些數中找與輸入最近的,做法也是線性的,但是我發現比sorting速度還慢。。。sorting 是nlogn的啊。
不過這個做法沒有貪心逼近好是真的
import java.io.*;
import java.math.BigInteger;
import java.util.*;
class node{
int a, b; int t1,t2;
public node(int x,int y){a=x;b=y;}
}
class problem{
int a,b;
node arr[] = new node[32767];
void solver() throws IOException{
Scanner scan = new Scanner(System.in);
a = scan.nextInt(); b = scan.nextInt();
double min = 99999;
int count = 0;
int n=0,m=0;
for(int i=1;i<=32767;i++){
if(i!=1&&i*b%a==0) continue;
int f = (int) Math.floor(i*b*1.0/a);
int c = (int) Math.ceil(i*b*1.0/a);
if(a==1){f-=1;c+=1;}
if(f<=32767&&Math.abs(f*a-i*b)<min) min = Math.abs(f*a-i*b);
if(c<=32767&&Math.abs(c*a-i*b)<min) min = Math.abs(c*a-i*b);
}
for(int i=1;i<=32767;i++){
if(i!=1&&i*b%a==0) continue;
int f = (int) Math.floor(i*b*1.0/a);
int c = (int) Math.ceil(i*b*1.0/a);
if(a==1){f-=1;c+=1;}
if(f<=32767&&Math.abs(f*a-i*b)==min) {arr[count++]=new node(i,f);}
if(c<=32767&&Math.abs(c*a-i*b)==min) {arr[count++]=new node(i,c);}
}
for(int i=0;i<count;i++){
if(arr[i].a*1.0/arr[i].b - a*1.0/b<min){
min = arr[i].a*1.0/arr[i].b;
n=arr[i].a; m = arr[i].b;
}
}
System.out.println(n+" "+m);
}
}
public class Main{
public static void main (String [] args) throws Exception {
problem p = new problem();
p.solver();
}
}