Проблема с таблицей факториалов

Мне нужно составить таблицу факториалов для задания, и где-то в этой строке моя логика неверна. Вот что у меня есть до сих пор.

public static void factors(int n) {
    int r = 1; //starts r as zero, as a basis for multiplication
    int t = n;
    int q;     //allows original number to be shown 
    while(n > 1) { // factorial calculation
        r= r * n;     
        n = n- 1; 
    }  
    while(t>0) {
        table(t,r);
        t=t-1;
    }
}

public static void table(int t, int r){
//  while(n>0)
    System.out.println(t+ "\t"+r);
//  n=n-1;

}

И вот вывод.

15  1409286144
14  1409286144
13  1409286144
12  1409286144
11  1409286144
10  1409286144
9   1409286144
8   1409286144
7   1409286144
6   1409286144
5   1409286144
4   1409286144
3   1409286144
2   1409286144
1   1409286144

person Nick Gatti    schedule 23.11.2013    source источник
comment
И что вы ожидаете получить? В вашем коде вы уменьшаете t в цикле, оставляя r постоянным, и печатаете полученный кортеж, разделенный символом табуляции.   -  person alko    schedule 23.11.2013
comment
@alko Я хочу получить факториалы каждого числа.   -  person Nick Gatti    schedule 23.11.2013
comment
Ник, когда ты звонишь table, ты всегда звонишь с одним и тем же r. Почему вы ожидаете получить в результате разные r? Компьютеры не могут читать ваши мысли, они делают только то, что говорит код.   -  person tucuxi    schedule 23.11.2013


Ответы (1)


Начните с получения одного факториала, а затем позаботьтесь о таблице.

Имена имеют значение: «факторы» — не очень хорошее название для факторного метода.

Вот наивная, ужасно неэффективная реализация:

public class Factorial {

    private static Map<Integer, Long> memo = new ConcurrentHashMap<Integer, Long>();

    public static void main(String[] args) {
        for (int i = 0; i < 11; ++i) {
            System.out.println(String.format("n: %d n!: %d", i, factorial(i)));
        }
    }
    public static long factorial(int n) {
        long value = 1L;
        if (n > 1) {
            if (memo.containsKey(n)) {
                value = memo.get(n);
            } else {
                for (int i = 1; i <= n; ++i) {
                    value *= i;
                }
                memo.put(n, value);
            }
        }
        return value;
    }
}
person duffymo    schedule 23.11.2013