Помощь - Поиск - Пользователи - Календарь
Полная версия: Длинная арифметика,случайное число
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Let
Ищу простое число по малой теореме Ферма.Там мне необходимо случайное число от 1 до искомого числа.Как реализовать функцию,которая бы выдавала случайное значение длинной арифметики?
volvo
Цитата
Как реализовать функцию,которая бы выдавала случайное значение длинной арифметики?
Можно посмотреть, какая реализация длинной арифметики имеется в виду (их даже на этом форуме есть несколько, не говоря уже о том, что есть вообще в сети), и в каких пределах должно быть значение?
Let
Цитата(volvo @ 4.01.2008 21:40) *

Можно посмотреть, какая реализация длинной арифметики имеется в виду (их даже на этом форуме есть несколько, не говоря уже о том, что есть вообще в сети), и в каких пределах должно быть значение?

Использовал модуль который лежит в FAQ:HUGEObJ.pas
А значение от 1 до 10^300.
volvo
Добавляем в TLargeInt еще один конструктор:

Constructor TLargeInt.Random(min, max: TLargeInt);
var
  i, len: integer;
  X: longint;
begin
  repeat
    FillChar(_me, sizeof(_me), 0);

    { Возможная длина случайного числа - от длина min до длины max }
    len := min.getlen + system.random(max.getlen - min.getlen);
    i := 0;
    repeat
      inc(i); Put(i, system.random(base)); { Добавляем Len случайных чисел }
    until i > len;
    SetLen(len); { Устанавливаем длину числа }

  { Выполнять, пока сгенерированное число не будет внутри заданного интервала }
  until (Cmp(min) > 0) and (Cmp(max) < 0); 
end;

Вызывать как-то вот так:

uses hugeobj;

var
  f: tlargeint;
  min, max: tlargeint;

  i: integer;

begin
  randomize;

  { инициализируем min и max}
  min.init(1);
  max.init(1); for i := 1 to 3 do max.muldigit(10); { <-- для теста, max = 1000 }

  { печатаем границы интервала }
  min.print(output); writeln;
  max.print(output); writeln;

  { и генерируем случайное число в этом интервале }
  f.random(min, max);
  f.print(output);
end.


Так пойдет?
Let
Цитата(volvo @ 6.01.2008 14:00) *

Так пойдет?

Да.Большое спасибо.Все работает.
ЗЫ:Правда вопрос по самому модулю:Перед тем как выполнять различные операции мы обязательно должны ввести число типа longint?А как тогда быть с большим числом,вводимым с клавиатуры?
Или я не правильно разобрался в работе самого модуля? unsure.gif
volvo
Цитата
А как тогда быть с большим числом, вводимым с клавиатуры?

Ну, в принципе модуль не был изначально предназначен для ввода чисел, больших, чем MaxLongInt, но никто ж не мешает добавить еще один конструктор smile.gif :

constructor TLargeInt.Init_s(const s: string);
var
  every, i, err: integer;
  value: longint;
  vs, base_s: string;

begin
  str(base - 1, base_s); every := Length(base_s);
  FillChar(_me, sizeof(_me), 0); vs := s;
  while length(vs) mod every <> 0 do vs := '0' + vs;

  i := 0;
  repeat
    val(copy(vs, length(vs) - every + 1, every), value, err);
    { Здесь можно добавить проверку на "нецелочисленное" содержимое строки... }
    inc(i); put(i, value);
    delete(vs, length(vs) - every + 1, every);
  until vs = '';
  setlen(i);
end;


и либо инициализировать так:
var s: string;
...
readln(s);
big_int.init_s(s);
...

, либо вообще внести процедуру чтения строки внутрь конструктора, и просто вызывать init_s без параметров... Только вот до 10300 со строкой не получится (только до 10255), но я не думаю, что у кого-то будет желание вводить > 200 символов... Если все же будет, то PChar в помощь, там подобного ограничения нет...
Let
Цитата(volvo @ 6.01.2008 18:59) *

Ну, в принципе модуль не был изначально предназначен для ввода чисел, больших, чем MaxLongInt, но никто ж не мешает добавить еще один конструктор smile.gif :

Никто не мешает smile.gif Уже добавил сам.Еще раз спасибо за сам модуль и за генератор чисел!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.