Java. Число сочетаний из N по М

280
04 декабря 2017, 16:55

Есть задача: Нужно реализовать функцию, которая будет искать число сочетаний из N по M, только с определенными условиями: Функция должна возвращать получающийся результат, если он не превышает 10^9. В противном случае функция должна вернуть -1.

Для вычисления результата внутри функции нужно выполнять последовательное умножение и деление результата на соответствующие значения. Например, число сочетаний из 7 по 3, то есть величину 7! / (3! * 4!), можно посчитать так. Сначала сократим 7! и 4!, получим выражение (5 * 6 * 7) / (1 * 2 * 3). Это выражение можно посчитать, домножив результат, который проинициализирован единицей на 7 и поделив на 1, затем домножив его на 6 и поделив на 2, затем домножив его на 5 и поделив на 3.

Ошибка в том, что неправильно реализовано сравнение с 10^9

public static long Combine(int n,int m) {
    if (n==0&&m==0) return 1;
    else if (m==0) return 1;
    else if (n==m) return 1;
    int bol=0;
    int men=0;
    if (m>=n/2+1) {
        bol = m;
        men=n-m;
    }
    else {
        bol=n-m;
        men=m;           //Находим значения, которые будут снизу дроби
    }
    int[] t = new int[n-bol];
        t[n-1-bol]=n;
    for (int i=n-2-bol;i>=0;i--) t[i]=t[i+1]-1;//Заполняем массивы значениями сокращенного факториала
    int[] b = new int[men];
        b[0]=1;
    for (int i=1;i<b.length;i++) b[i]=b[i-1]+1;
    double k =t[0]/b[0];
    for (int i=1;i<b.length;i++){          //Вычисляем К последовательно разделив и умножив
        k=k/b[i]*t[i];
        if (k>1000000000) return -1;
    }
    for (int i=b.length;i<t.length;i++) {         // где-то тут ошибка в проверке на 10^9
        if (t[i]>1000000000/k) return -1;
        k*=t[i];
        if (t[i]>1000000000/k) return -1;
    }
    long c = (long) k;
    return c;
}
public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
   int t=in.nextInt();
    long[] a=new long[t];
   for (int i=0;i<t;i++){
        int n=in.nextInt();
        int m=in.nextInt();
       a[i]=Combine(n,m);
    }
    for (int i=0;i<a.length;i++){
       if (a[i]!=-1) System.out.println(a[i]);
       else System.out.println("Too big!");
    }
}

}

READ ALSO
Вывод текста в цикле else.Java

Вывод текста в цикле else.Java

При создании маленького консольного калькулятора

239
библиотека aFileChooser. Не могу открыть указанную директорию для выбора файла

библиотека aFileChooser. Не могу открыть указанную директорию для выбора файла

вот библиотекавнизу есть и документация к ней https://bintray

222
Serialization Java

Serialization Java

Всем привет Думал, что разобрался в сериализации, но наткнулся на непоняткуСоздаю LinkedList< User >

174