Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Результаты опроса: Хороший фокус с факториалом
да 1 20.00%
нет 2 40.00%
иногда помогает 0 0%
затрудняюсь ответить 2 40.00%
Голосовавшие: 5. Вы ещё не голосовали в этом опросе

Ответ
 
Опции темы Поиск в этой теме
Старый 02.11.2014, 14:51   #1
newerow1989
Я самый любопытный
Участник клуба
 
Аватар для newerow1989
 
Регистрация: 24.07.2012
Сообщений: 1,949
По умолчанию Фокусы с факториалом

Даны 2 абсолютно одинаковых программных кода, вычисляющих факториал при больших числах, но работающих по каким-то неизведанным науке причинам по-разному:
1 код:
Код:
const max_dlina=3000;
var p:array[0..max_dlina-1] of byte;

function Faktorial(chislo: integer): string;
var i:integer;

procedure umnozhenie(chislo:integer);
var i,k,um:integer;
    p1:array[0..max_dlina-1] of integer;
begin
   k:=0;
   For i:=0 to max_dlina-1 do
      p1[i]:=0;
   Repeat
      k:=k+1;
      um:=0;
      For i:=max_dlina-1 downto 1 do
      begin
         p1[i-k+1]:=p1[i-k+1]+um+p[i]*(chislo mod 10);
         um:=p1[i-k+1] div 10;
         p1[i-k+1]:=p1[i-k+1] mod 10;
      end;
      chislo:=chislo div 10;
   Until chislo=0;
   For i:=0 to max_dlina-1 do
      p[i]:=p1[i];
end;

begin
   For i:=0 to max_dlina-2 do
      p[i]:=0;
   p[max_dlina-1]:=1;
   For i:=1 to chislo do
      umnozhenie(i);
   Result:='';
   For i:=0 to max_dlina-1 do
      Result:=Result+IntToStr(p[i]);
   While (Result<>'') and (Result[1]='0') do
      Delete(Result,1,1);
end;
2 код:
Код:
const max_dlina=3000;
var p:array[0..max_dlina-1] of byte;

procedure umnozhenie(chislo:integer);
var i,k,um:integer;
    p1:array[0..max_dlina-1] of integer;
begin
   k:=0;
   For i:=0 to max_dlina-1 do
      p1[i]:=0;
   Repeat
      k:=k+1;
      um:=0;
      For i:=max_dlina-1 downto 1 do
      begin
         p1[i-k+1]:=p1[i-k+1]+um+p[i]*(chislo mod 10);
         um:=p1[i-k+1] div 10;
         p1[i-k+1]:=p1[i-k+1] mod 10;
      end;
      chislo:=chislo div 10;
   Until chislo=0;
   For i:=0 to max_dlina-1 do
      p[i]:=p1[i];
end;

function Faktorial(chislo: integer): string;
var i:integer;
begin
   For i:=0 to max_dlina-2 do
      p[i]:=0;
   p[max_dlina-1]:=1;
   For i:=1 to chislo do
      umnozhenie(i);
   Result:='';
   For i:=0 to max_dlina-1 do
      Result:=Result+IntToStr(p[i]);
   While (Result<>'') and (Result[1]='0') do
      Delete(Result,1,1);
end;
Как видите, что переставлена процедура umnozhenie.
Вопрос №1: Почему абсолютно одинаковые коды работают по-разному при вычислении факториала от 101!? 2 код работает абсолютно верно, чем 1 код (числа берите большие, т.е. от 101 и выше).
Вопрос №2: Почему 2 код принимает входные числа от 0 до 999, но не может вычислить 1000! и выше?
Вопрос №3: Как изменить такое "загадочное поведение" этих функций? Т.е. вычислить абсолютно правильно хотя бы, к примеру, 1485!?

PS: такое необъяснимое науке вычисление производится на Delphi 6, Delphi 7, Windows XP, Windows 7 Домашняя базовая
С запрограммированным приветом, Неверов Евгений!
Сайт: http://newerow1989.ru
[Паскаль] [Delphi]
newerow1989 вне форума Ответить с цитированием
Старый 02.11.2014, 17:48   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Вижу где у компилятора крышу сорвало - цикл до chislo=101, но после 100 i принимает значение 1, а не 101. И считает соответственно 100!, а не 101!
Код:
For i:=1 to chislo do
      umnozhenie(i);
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 03.11.2014 в 09:07.
Аватар вне форума Ответить с цитированием
Старый 02.11.2014, 20:27   #3
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

{$R+} тебе в помощь.
Somebody вне форума Ответить с цитированием
Старый 03.11.2014, 04:51   #4
newerow1989
Я самый любопытный
Участник клуба
 
Аватар для newerow1989
 
Регистрация: 24.07.2012
Сообщений: 1,949
По умолчанию

Цитата:
{$R+} тебе в помощь.
Выдает ошибку
Изображения
Тип файла: jpg Безымянный.jpg (10.9 Кб, 67 просмотров)
С запрограммированным приветом, Неверов Евгений!
Сайт: http://newerow1989.ru
[Паскаль] [Delphi]
newerow1989 вне форума Ответить с цитированием
Старый 03.11.2014, 08:41   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Выдает ошибку
потому тебе и посоветовали поставить этот ключ. чтоб ты увидел причину в разнице результатов.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.11.2014, 08:48   #6
newerow1989
Я самый любопытный
Участник клуба
 
Аватар для newerow1989
 
Регистрация: 24.07.2012
Сообщений: 1,949
По умолчанию

А как устранить ошибку?
С запрограммированным приветом, Неверов Евгений!
Сайт: http://newerow1989.ru
[Паскаль] [Delphi]
newerow1989 вне форума Ответить с цитированием
Старый 03.11.2014, 08:50   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
p1[i-k+1]:=p1[i-k+1]+um+p[i]*(chislo mod 10);
смотри i=1 и k=3
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 03.11.2014, 08:55   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
А как устранить ошибку?
для начала выяснить где (аватар подсказывает) где ошибка. потом почитать в хелпе о этом ключе - для чего он нужен (выход за пределы массива). н а потом пересобрать код.
I'm learning to live...

Последний раз редактировалось Stilet; 03.11.2014 в 09:00.
Stilet вне форума Ответить с цитированием
Старый 03.11.2014, 08:57   #9
newerow1989
Я самый любопытный
Участник клуба
 
Аватар для newerow1989
 
Регистрация: 24.07.2012
Сообщений: 1,949
По умолчанию

Кажется, сообразил. Спасибо за помощь!
С запрограммированным приветом, Неверов Евгений!
Сайт: http://newerow1989.ru
[Паскаль] [Delphi]
newerow1989 вне форума Ответить с цитированием
Старый 03.11.2014, 09:10   #10
newerow1989
Я самый любопытный
Участник клуба
 
Аватар для newerow1989
 
Регистрация: 24.07.2012
Сообщений: 1,949
По умолчанию

Исправил:
Код:
For i:=max_dlina-1 downto 1 do
   If (i>k) then
      begin
         p1[i-k+1]:=p1[i-k+1]+um+p[i]*(chislo mod 10);
         um:=p1[i-k+1] div 10;
         p1[i-k+1]:=p1[i-k+1] mod 10;
      end;
Проверял на системном калькуляторе - все работает!
С запрограммированным приветом, Неверов Евгений!
Сайт: http://newerow1989.ru
[Паскаль] [Delphi]
newerow1989 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с факториалом. student bmstu Помощь студентам 6 01.11.2014 14:09
Паскаль с факториалом wolsenpak Паскаль, Turbo Pascal, PascalABC.NET 1 27.06.2014 21:24
Проблема с факториалом! maxick96 Помощь студентам 5 03.12.2012 11:41
Вычисления с факториалом Vlt Помощь студентам 4 18.05.2012 22:41