Кто шарит в паскале - Help please.
-
Составить программу вычисления n! для любого n в диапазоне от 1 до 70. Обратить внимание, что 70! будет содержать 102 десятичные цифры.
Готовые библиотеки использовать незя, основной запор программы - то что в integer не влазит 102 символа, надо делать массив [1..102] но как это оформить фиг знает. Батько гугл подсказал токо как решать на словах, но доходит туго - ничерта нипонятно, готовой программы нет((
-
думай, вместо 5 часов манча поюзай мозг)
-
Впихун, я думал, не получаеться чёто.
-
Функция:
[code:2iao4hx4]function blablabla (z : Integer): Integer;
begin
if z = 0 Then
blablabla := 1
else
blablabla := z * blablabla(z - 1);
end;[/code:2iao4hx4]Ну и применить можно примерно так:
[code:2iao4hx4]var a : Integer;
...
writeln('введи число:');
readln (a);
If a < 0 Then
writeln('из негативного числа нельзя')
Else
writeln('ответ: ', a, ' = ', blablabla(a));
...[/code:2iao4hx4]Насчёт integer ещё подумать надо.
Позже отпишусь, если что найду.
-
МасиМасян, <!-- m --><a class="postlink" href="http://www.delphisources.ru/pages/faq/base/factorial.html">http://www.delphisources.ru/pages/faq/b ... orial.html</a><!-- m --> .
Редактировать не много т_Т -
@"Beyond_Devinity":
Функция:[code:3c01iny5]function blablabla (z : Integer): Integer;
begin
if z = 0 Then
blablabla := 1
else
blablabla := z * blablabla(z - 1);
end;[/code:3c01iny5]Ну и применить можно примерно так:
[code:3c01iny5]var a : Integer;
...
writeln('введи число:');
readln (a);
If a < 0 Then
writeln('из негативного числа нельзя')
Else
writeln('ответ: ', a, ' = ', blablabla(a));
...[/code:3c01iny5]Насчёт integer ещё подумать надо.
Позже отпишусь, если что найду.
Что то похожее я читал интеджер не вмещает количество знаков содержащееся в 70! и вроде 67-69! (могу ошибаться с гранцами) тоже.
Имено в этом и вся маза задачи. -
Funky, Это дельфи, я в нем не шарю.
ЗЫ. Сори что 2 сообщения подряд, мне система не дает редактировать предыдщее - пишет прав нет О_О (1 раз такой баг, до этого норм редактил))
-
Попробуй вместо интеджера extended (числа длиной около 4к символов) или double (около 300).
-
Базовыми знаниями паскаля мне удалось вычислить факториал 32х Т_Т
Как дальше реализовать это в паскале не имею ни малейшего представления. -
@"Beyond_Devinity":
Попробуй вместо интеджера extended (числа длиной около 4к символов) или double (около 300).В борланд паскале этого нету, а библиотеки незя использовать!
-
Интересная задача.
То, что за 5 мин пришло в голову:
Создаём массив из 102 элементов, или скоко там надо.
В конец пишем единичку.
Умножаем последний элемент (т.е. единичку) на 2 - пока всё нормально. Потом на 3 - тоже всё ок. После умножения на 4 в последнем элементе получается 24.
В цикле, который постоянно умножает последний элемент на последовательные числа, нужно куда-нибудь запихнуть проверку, что если последний элемент больше 10, из него вычитается 10, и прибавляется 1 к предпоследнему элементу - и аналогично для всех остальных элементов массива. (естественно эта проверка вызывается в отдельном цикле нужное число раз)
В итоге вместо числа 24 в последней ячейке будет в предпоследней число 2, и в последней число 4. Ну и так далее :roll:ЗЫ Боюсь представить, СКОЛЬКО это займёт времени, но т.к вопрос о быстродействии не ставился...
Update: умножать нужно не только последнюю ячейку, а весь массив...
-
Так как самому приходится паскаль изучать, счас сел и попробовал написать - по своему методу в предыдущем посте
Получилось
(Писалось в турбо паскале, т.к. другого нету)
Если хочешь могу исходник дать, но пишется кстати не так уж сложно - наверное, всего около 40 строк
-
La chate, напиши здесь пожалуйсто!
-
Cмерть археологам!
-
@"Сказочник":
Cмерть археологам!Не нашлось на него хорошей мумии -
М*мии
-
@"Metaphor":
М*мии
рофл. -
Фу, такая простая задача, а вы бред пишете.
Я тоже бред напишу, зато за 3 минуты и все работает (да, криво, но сейчас лень даже вывод нормальный писать)
[code:2yi2jd5e]program p1;
var
a,b,c : array [1..200] of integer;
b0,i,j,l,b1,b2,k : integer;begin
readln(b0);
l:=195;
for i:=1 to 200 do begin
a**:=0;**
end;
a[1]:=1;
for i:=2 to b0 do begin
b1:=i mod 10;
b2:=(i-b1) div 10;
writeln(i,b2,b1);
for k:=1 to 200 do begin
b[k]:=0;
c[k]:=0;
end;
for j:=1 to l do begin
*b[j]:=b[j]+a[j]b1;
if b[j]>=10 then begin
b[j+1]:= b[j+1] + (b[j] div 10);
b[j]:=b[j] mod 10
end;
*c[j]:=c[j]+a[j]b2;
if c[j]>=10 then begin
c[j+1]:= c[j+1]+ (c[j] div 10);
c[j]:=c[j] mod 10
end;
end;
a[1]:=b[1];
for j:=2 to l do begin
a[j]:=b[j]+c[j-1];
if a[j]>=10 then begin
a[j+1]:= a[j+1]+ (a[j] div 10);
a[j]:=a[j] mod 10
end;
end;
end;
for i:=1 to 195 do begin
write(a[196-i]);
end;
writeln('');
end.[/code:2yi2jd5e]
-
вообще то
[j]+c[j-1];
if a[j]>=10 then begin
a[j+1]:= a[j+1]+ (a[j] div 10);
a[j]:=a[j] mod 10
1 to l do begin
b[j]:=b[j]+a[j]*b1;
if b[j]>=10 then begin
b[j+1]:= b[j+1
]*b2;
if c[j]>=10 then begin
c[j+1]:= c[j+1]+ (c[j] div 10);
c[j]:=c[j] mod 10 ]*b2;
if c[j]>=10 then begin
c[j+1]:= c[j+1]+ (c[j] div 10);
c[j]:=c[j] mod 10 ]*b2;
if c[j]>=10 then begin
c[j+1]:= c[j+1]+ (c[j] div 10);
c[j]:=c[j] mod 10 -
Deathspell, и какова смысловая нагрузка поста?
p.s. в качестве домашнего задания:
-используйте только один массив, а не три
-храните в ячейке массива больше данных, чем один десятичный разряд числа
-сделайте, чтобы в l хранилась реальная длинна получающегося числа