ne_viens
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору [code] import java.util.Comparator; import java.util.Arrays; import java.util.ArrayList; import java.util.Collections;
class Premul { int a; int b; double mul; }
class GearSet { int a; int b; int c; int d; double delta; double ratio; GearSet(int a, int b, int c, int d, double delta, double ratio) { this.a = a; this.b = b; this.c = c; this.d = d; this.delta = delta; this.ratio = ratio; }
@Override public String toString() { return String.format("%.5f", delta) + "%,\t" + Integer.toString(a) + "/" + Integer.toString(b) + ",\t" + Integer.toString(c) + "/" + Integer.toString(d); } }
class SortGears implements Comparator<GearSet> { public int compare(GearSet a, GearSet b) { if(a.delta > b.delta) return 1; if(a.delta < b.delta) return -1; return 0; } }
class SortMul implements Comparator<Premul> { public int compare(Premul a, Premul b) { if(a.mul > b.mul) return 1; if(a.mul < b.mul) return -1; return 0; } }
class GearCalc { private Premul[] pm;
GearCalc(String s) { String[] arr = s.split(","); int len = arr.length;
int[] gears = new int[len]; for(int i = 0; i < len; ++i) gears[i] = Integer.parseInt(arr[i]); pm = new Premul[len * len];
for(int j = 0; j < len; ++j) { for(int i = 0; i < len; ++i) { pm[i + j * len] = new Premul(); pm[i + j * len].a = gears[j]; pm[i + j * len].b = gears[i]; pm[i + j * len].mul = gears[j] * gears[i]; } } Arrays.sort(pm, new SortMul()); } ArrayList<GearSet> calc(double u, double precision) { ArrayList<GearSet> gs = new ArrayList<>();
for(int j = 0; j < pm.length; ++j) { double x = pm[j].mul / u; int i = vlookup(x);
for( ; i < pm.length; ++i) { double ratio = pm[j].mul / pm[i].mul; double delta = ratio / u - 1.; delta = delta < 0. ? 0. - delta : delta; if(delta < precision * 0.01) { gs.add(new GearSet(pm[j].b, pm[i].b, pm[j].a, pm[i].a, delta * 100, ratio)); }
if(pm[i].mul > x) break; } } Collections.sort(gs, new SortGears()); return gs; } private int vlookup(double x) //finds an index of next-lowest mul value { int lo = 0; int hi = pm.length - 1; int i = hi / 2; while(hi >= lo) { if(this.pm[i].mul < x) lo = i + 1; else hi = i - 1; i = (hi + lo) / 2; } return i; } }
public class calc { public static void main(String[] args) { String s = "20,20,23,24,25,25,30,33,34,35,37,40,41,43,45,47,48,50,53,55,57,58,59,60,61,62,65,67,70,71,73,75,79,80,83,85,89,90,92,95,97,98,100"; long start = System.nanoTime(); GearCalc gc = new GearCalc(s); ArrayList<GearSet> gs = gc.calc(0.184584124, 0.01); System.out.println("Execution time: " + (double)(System.nanoTime() - start) / 1000000. + "ms\n"); for(int i = 0; i < gs.size(); ++i) { System.out.println(gs.get(i)); } } }
[/code] |