Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Факториал 
:(
    Опции темы
Fin
Дата 23.2.2007, 00:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дракон->Спать();
**


Профиль
Группа: Участник
Сообщений: 687
Регистрация: 4.1.2006

Репутация: нет
Всего: 10



Тебе в какой системе нужно выводить результаты? Я имею ввиду базис счисления. 



--------------------
Пролетал мимо.
PM MAIL   Вверх
batek
Дата 23.2.2007, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 22.2.2006

Репутация: нет
Всего: нет



10
PM MAIL   Вверх
Pakshin A. S.
Дата 23.2.2007, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



А если написать функцию умножения двух чисел, представленных в строковом формате? Тогда будет иметься возможность вывода больших факториалов...
PM   Вверх
Fin
Дата 23.2.2007, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дракон->Спать();
**


Профиль
Группа: Участник
Сообщений: 687
Регистрация: 4.1.2006

Репутация: нет
Всего: 10



тоды тебе придётся еше писать функцию деления. И делить полученный массив на 10.

Есть второй выход. Базис брать не 256 при умножении а 100 скажем. Просто не рационально будет использоваться память. И естественно нужно будет ее выделять больше. Но в 10 тичную систему счисления будет намного легче перейти smile

Добавлено @ 01:00 
Pakshin A. S., Ему тогда придтся еше работать с ASCII кодами. А так можно получить тоже самое,


--------------------
Пролетал мимо.
PM MAIL   Вверх
W4FhLF
Дата 23.2.2007, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 6
Всего: 121



FGInt посмотри. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
batek
Дата 23.2.2007, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 22.2.2006

Репутация: нет
Всего: нет



W4FhLF
Нет такого
PM MAIL   Вверх
batek
Дата 23.2.2007, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 22.2.2006

Репутация: нет
Всего: нет



Определить последнюю цифру не равную 0 при вычислении факториала N!, причем N задается в пределах от 1 до 10000. 

PM MAIL   Вверх
maxim1000
Дата 23.2.2007, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 4
Всего: 110



а эта задача уже обсуждалась smile
http://forum.vingrad.ru/index.php?showtopic=33505


--------------------
qqq
PM WWW   Вверх
batek
Дата 23.2.2007, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 22.2.2006

Репутация: нет
Всего: нет



maxim1000
Спасибо но все таки надо попробовать как нить найти факториал 10000
PM MAIL   Вверх
maxim1000
Дата 23.2.2007, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 4
Всего: 110



так я и не спорю, просто для задачи про последнюю цифру это необязательно


--------------------
qqq
PM WWW   Вверх
W4FhLF
Дата 23.2.2007, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 6
Всего: 121



Цитата(batek @  23.2.2007,  11:55 Найти цитируемый пост)
W4FhLFНет такого


http://www.google.ru/search?hl=ru&neww...1%D0%BA&lr=


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
W4FhLF
Дата 23.2.2007, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 6
Всего: 121



http://shade.msu.ru/~msu-se/llong.7z

Код

procedure TForm1.Button1Click(Sender: TObject);
var
Time:dword;
n,Fac:lLongInt;
i:dword;
begin
  n.create(6);
  Fac.create($FFFF);

  Time := GetTickCount();
  Fac.strtolint('1');
  for i := 1 to 10000 do
  begin
    n.strtolint(IntToStr(i));
    Fac.umult(Fac, n);
  end;
  Memo1.Text := Fac.linttostr;
  ShowMessage('Затрачено секунд: ' + IntToStr((GetTickCount()-Time) div 1000));
end;


У меня Athlon3500+, на вычисления уходит порядка 10 сек.


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Rockie
Дата 24.2.2007, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: нет
Всего: 31



Цитата(batek @  22.2.2007,  22:58 Найти цитируемый пост)
а можно ли как нибудь проверять переполнилась переменная или нет, но что бы программа не вылетала

Если переменная не unsigned то после переполнения пойдут отрицательные значения. Извините что не Delphi.

Код

#include <iostream>

int main()
{
    char c = 0;

    for(int i=0;i<1024;i++)
        std::cout<<(int)c++<<' ';

    return 0;
}





--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Alexeis
Дата 24.2.2007, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



С модулем FGint по лучше получается. Вычисления произвел в 2 потока, на Athlon x2 3800+
Результат 0,2с для 10000! и 32с для 100000!

http://www.koders.com/delphi/fidB46DDCCA26...spx?s=algorithm

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, FGInt, IdGlobal;

type
  TNewThread = class;

  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
     res      : TFGInt;
     tr1, tr2 : TNewThread;
     Cr       : TCriticalSection;
     threadsTerminated : Integer;
     Timer    : Integer;
     procedure MultByRes(value : TFGInt);
  end;

  TNewThread = class(TThread)
     constructor Create(CreateSuspended: Boolean; fromV : integer; ToV : integer);
     procedure Execute;  override;
  protected
     fromV, ToV : Integer;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TNewThread }

constructor TNewThread.Create(CreateSuspended: Boolean; fromV, ToV: integer);
begin
  inherited Create(CreateSuspended);
  self.fromV := fromV;
  self.ToV   := ToV;
end;

procedure TNewThread.Execute;
var
  Fac  : TFGInt;
  i    : dword;

begin
  Base10StringToFGInt('1', Fac);

  for i := fromV to ToV
  do
    FGIntMulByInt(Fac, Fac, i);

  Form1.MultByRes(Fac);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Base10StringToFGInt('1', res);
  tr1 := TNewThread.Create(true, 1, 5000);
  tr2 := TNewThread.Create(true, 5001, 10000);
  Cr  := TCriticalSection.Create;
  threadsTerminated := 0;
  Timer := GetTickCount();
  tr1.Resume;
  tr2.Resume;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  tr1.Free;
  tr2.Free;
  Cr.Free;
end;

procedure TForm1.MultByRes(value : TFGInt);
var
  S    : AnsiString;
  temp : TFGInt;
begin
  Cr.Enter;
    inc(threadsTerminated);
    temp := res;
    FGIntMul(temp, value, res);
    if threadsTerminated = 2
    then
      Begin
        MessageBox(0, PChar(IntToStr(GetTickCount()-Timer)), 'Time', 0);
        FGIntToBase10String(res, s);
        MessageBox(0, PChar(s), 'Value', 0);
      End;

  Cr.Leave;
end;

end.




Это сообщение отредактировал(а) Alexeis - 24.2.2007, 18:48


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Alexeyt
Дата 25.2.2007, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 15.9.2006
Где: около Москвы

Репутация: нет
Всего: 2



Народ, в чем проблема факториал посчитать?
Берем тип Extended (чтобы не было переполения. Int64 не хватит).

Код

R:= 1;
for i:= 1 to N do
  R:= R * i;


Умножаем в цикле рез-т на i, увеличивая i. Никакой рекурсии не нужно.
Естетвенно, на больших N будет потеря точности. Т.к. Extended тоже ограничен.


Это сообщение отредактировал(а) Alexeyt - 25.2.2007, 22:08
PM WWW   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1100 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.