Сейчас на форуме: hgdagon, asfa, bartolomeo (+5 невидимых) |
eXeL@B —› Программирование —› Факториал |
Посл.ответ | Сообщение |
|
Создано: 08 октября 2006 06:07 · Поправил: Hellspawn · Личное сообщение · #1 извените за столь глупый вопрос, но вот что то всё никак, есть код [HIGHLIGHT=delphi] function FactorialX(X: Integer): Int64; begin if X = 0 then FactorialX := 1 else FactorialX := FactorialX(X - 1) * X; end;[/HIGHLIGHT] но он считает факториал только до 20 дальше похожу переполнение, я так понимаю челочисленно никак не получится?
а мне нужно хотя бы до 25, как это сделать? з.ы. что то у меня в опере подсветка кода не встевляется, пришлось руками прописать ----- [nice coder and reverser] |
|
Создано: 08 октября 2006 06:11 · Личное сообщение · #2 |
|
Создано: 08 октября 2006 06:14 · Поправил: Hellspawn · Личное сообщение · #3 |
|
Создано: 08 октября 2006 06:17 · Личное сообщение · #4 Hellspawn Из Delphi World: Процедура для нахождения точного значения факториала числа ---------------------------------------------------------------------- ---------- Процедура для нахождения точного значения факториала числа. Вы когда-нибудь находили факториал 10? - это легко, а 20?,а 100? Даже с помощью самого продвинутого калькулятора это не получится, (имею в виду точное значение, например в 100!-158 цифр, какой должен быть дисплей калькулятора, чтобы показать такое значение??!)C помощью программы содержащей алгоритм похожий на описанный, это можно сделать. Для такой программы нужна форма(form, содержащая такие компоненты Memo(имя в процедуре mmOutput), Maskedit(med),ProgressBar(PB-это не обязательно, но если считаешь очень большой факториал, то это занимает некоторое время, поэтому визуально следить за временем, оставшимся на вычисление, очень удобно). Идея программы: переменные в Delphi не могут содержать таких длинных чисел, поэтому здесь используется массив целых переменных, обрабатывая который и получаем нужный ответ. В результате можно считать факториалы многотысячных чисел, я считал 5000!,дальше считать долго, но возможно. [HIGHLIGHT=delphi] procedure TForm1.bbRunClick(Sender: TObject); //обработка события от мыши var //это раздел указания переменных result: string; //переменная result целого типа M: array of integer; //"M"- это матрица, или массив, причем динамический, то есть его размеры можно F, i, j, k, n: integer; //изменять, это увеличивает время выполнения программы, но интересно попробовать begin if med.text = '' then med.text := '0'; //свойство text компонента med проверяется на наличие n := StrToInt(Trim(MEd.Text)); //введенного числа, StrToInt-преобразование строки в число if n < 4 then exit; //trim-удаление пробелов из строки PB.Max := (n + sqr(n)); //Это определение размеров PB PB.Position := 0; screen.Cursor := crHourGlass; //появляется новый курсор, стандартный "виндовский" setLength(M, 2); //определение границ массива M[0] := 1; //присвоение 0-ому элементу массива М значения 1.... M[1] := 0; k := 1; for i := 1 to n do begin F := 0; PB.StepBy(i * 2); //изменение показаний PB for j := 0 to k do begin SetLength(M, k + 1); M[j] := M[j] * i + F; //здесь основная идея программы if (M[j] div 10) > 0 then k := k + 1; F := M[j] div 10; M[j] := M[j] mod 10; end; end; for i := k downto 0 do //перебор целых значений от k до 0 begin if M[i] > 0 then break; if M[i] = 0 then k := k - 1; end; SetLength(M, k); //изменение размеров массива М до кол-ва элементов-k Result := ''; for j := k downto 0 do Result := Result + IntToStr(M[j]); mmOutput.Lines.Add(IntToStr(n) + '! = ' + result); //добавление результата в редактор Memo(mmOutput) if n6.Checked = true then mmoutput.Lines.Add('В этом числе ' + IntToStr(length(result)) + ' цифр.'); M := nil; //освобождение памяти IntToStr-преобразование числа в строку screen.Cursor := crDefault; //смена курсора Med.Text := ''; Med.SetFocus; //передача фокуса ввода компоненту med end; [/HIGHLIGHT] ----- Сколько ни наталкивали на мысль – все равно сумел увернуться |
|
Создано: 08 октября 2006 06:20 · Личное сообщение · #5 |
|
Создано: 08 октября 2006 06:20 · Личное сообщение · #6 |
|
Создано: 08 октября 2006 06:34 · Поправил: Hellspawn · Личное сообщение · #7 |
|
Создано: 08 октября 2006 06:36 · Личное сообщение · #8 |
|
Создано: 08 октября 2006 10:05 · Личное сообщение · #9 |
|
Создано: 08 октября 2006 10:06 · Личное сообщение · #10 |
|
Создано: 08 октября 2006 11:05 · Личное сообщение · #11 |
eXeL@B —› Программирование —› Факториал |
Эта тема закрыта. Ответы больше не принимаются. |