Есть двумерная пирамида из кирпичей. Вес 1го - 1 кг, давит равномерно на 2 под ним по 0.5кг.
То есть, если на верхний давит +100 кг, тогда под ним на каждый будет (100+1)/2 кг - на нижний давит пол веса каждого над ним.
1,0=.5 2,0=.75 2,1=1.5 3,0=.875 3,1=.2.125
Как вычислять давление на любой из них, указывая позицию, например, к4-2, к8-4 ... к(рядСверху,номерСлева) - как функция с 2 параметрами, возвращающая вес?
Думал, pяд*.5 + (pяд-1)/2 или 1*(c+1) / 2*p + 1*c / 2*p, разные другие варианты, но никак не могу подобрать точный. (желательно на java)
Ответ
А почему не воспользоваться рекурсией? Значения веса, номер ряда и номер кирпича в ряду вставляйте какие вам надо:
public static void main(String[] args) {
float weight = 1; //вес кирпча
int row = 5; //номер ряда начиная с 1 с верху
int num = 3; //номер кирпича слева (или с права, как больше нравится) с 1
System.out.println(pressueOnBrick(row, num, weight));
}
//давление на один кирпич
public static float pressueOnBrick(int row, int num, float weight) {
return pressue(row, num, weight) - weight; //давление оказываемое на один кирпич = полное
//давление которое оказывает кирпич минус вес кирпича
}
//полное давление оказываемое кирпичём (включая свой вес)
public static float pressue(int row, int num, float weight) {
//в ряду не может быть кирпичей с номером меньше 1 и больше чем номер ряда(число кирпичей в ряду = номеру ряда)
if (num < 1 || num > row) {
return 0;
}
//давление которое оказывает кирпич равно сумме веса кирпича и половине веса кирпичей которые давят на него
//слева и справа
return weight + (pressue(row - 1, num - 1, weight) + pressue(row - 1, num, weight)) / 2;
}
Валидация вводимых значений на вашей совести.
Комментариев нет:
Отправить комментарий