Помощь - Поиск - Пользователи - Календарь
Полная версия: задача с геометрической прогрессией
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Bankir
Помогите плз решить такую задачу в Паскале через проседуры
Условие:
По одной легенде шах предложил мудрецу любой подарок какой тот захочет. Мудрец сказал чтобы на первую кетку шахматной доски положили одно зерно, на 2 - 2 зерна, на 3 - 4 зерна, на 4 - 16 зёрен и.т.д. ( геометрическая прогрессия)
Составить программу, с помощью которой модно вычислить на какой клетке суммарное кол-во зёрен превысит N шт. ( на шахматной доске 64 клетки)

Заранее спасибо.
volvo
В чем проблема? На чем застопорились?
Не знаем, как оформить геометрическую прогрессию?
klem4
проблема в том ,что cкоро члены ряда перестанут умещаться в
LongInt
;)

Bankir, тебе Сюда
volvo
Цитата(klem4 @ 29.05.05 9:25)
проблема в том ,что cкоро члены ряда перестанут умещаться в LongInt ;)

А Comp на что?
С его помощью можно попробовать обойтись без длинной арифметики...
klem4
Можт я чего-то не понимаю, но
хмм.. 8-й член = 4294967296*4294967269, так что я даже и не знаю, как тут Comp'ом обойтись
сплошные error'ы ;)
volvo
Цитата(Bankir @ 28.05.05 17:37)
По одной легенде шах предложил мудрецу любой подарок какой тот захочет. Мудрец сказал чтобы на первую кетку шахматной доски положили одно зерно, на 2 - 2 зерна, на 3 - 4 зерна, на 4 - 16 зёрен и.т.д. ( геометрическая прогрессия)

Давай уточним условие:
если у тебя прогрессия геометрическая, то на 2-ю клетку должны были положить в 2 раза больше чем на первую, на 3-ю - в 2 раза больше чем на вторую, и т. д. Из чего:
1 - 1
2 - 2 (1 * 2)
3 - 4 (2 * 2)
4 - 8 (4 * 2) У тебя 16... Откуда? Или это гипергеометрическая прогрессия? Уточни...
Bankir
Да... с 16-ю я ошибся
А застопорился я на том что не могу понять как записать формулу геометрической прогресии - какие переменные куда подставлять и.т.д. и как оформить цыкл
volvo
Вот тебе пример:
{$n+}
var
n, count, sum: comp;
i: byte;

begin
Write('n = '); readln(n);
i := 1; count := 1; sum := 1;
while sum < n do begin
count := count*2;
sum := sum + count;
inc(i)
end;
writeln('На клетке №', i)
end.

Это будет работать почти всегда...
Bankir
С типом переменных comp ни чего не работало
показывалась ошибка на строчке "readln(n);" -
error 116: Must be in 8087 mode to compile this.
Но с переменой типа на Integer всё заработало.
Спосиба большое.
P.S. а че за переменная comp в школе нам не рассказывали про неё?
klem4
хех, поставь первой строкой в рограмме

{$n+}
volvo
Так в том-то и дело, что с Integer ты можешь работать только до 16-ой клетки, а сумма - вообще до 15-ой, так как размер Integer - 16 бит. Если же брать Comp (длинное "целое"), то его размер - 8 байт (64 бита), следовательно ты сможешь работать до 64 клетки...

P.S. Программу подправил...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.