Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Алгоритмы

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
На первую страницук этому сообщениюк последнему сообщению

Открыть новую тему     Написать ответ в эту тему

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]

Всего записей: 1530 | Зарегистр. 01-11-2004 | Отправлено: 19:19 02-01-2019
Открыть новую тему     Написать ответ в эту тему

На первую страницук этому сообщениюк последнему сообщению

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Алгоритмы


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru