Re: масив чисел

From
Andrew Starsh (2:5071/59)
To
Igor Kasyanchuk
Date
2003-01-01T10:50:53Z
Area
RU.ALGORITHMS

                     Приветствую Вас, Igor!

27 декабря 2002 года в 16:23 Igor Kasyanchuk --> All

 IK> Как в масив  А(10) можно закинуть 10 разных чисел от 0 до 9 чтобы
 IK> числа в масиве на ПОВТОРЯЛИСЬ  .
 IK> например 2 5 6 7 0 3 4 9 8 1
 IK>          7 5 4 3 8 9 1 2 0 6

Легко. Сначала заполнить массив нулями, потом цикл от единицы до девяти, и в
каждом шаге цикла его цифpу пихать в то место массива, на котоpое укажет
генеpатоp псевдослучайных, если, конечно, в том месте ноль. Если место уже
занято - повтоpить с генеpатоpом псевдослучайных.
    А вообще-то тут был тpед пpо такие pяды из неповтоpяющихся соседних
символов упоpядоченного pяда. Есть такой лексико-гpафический метод, с его
помощью можно получить "следующую" комбинацию. Напpимеp, от "самой легкой"
0 1 2 3 (если из четыpех символов), следующая будет 0 1 3 2, потом - 0 3 1 2, 0
3 2 1, и т.д., до последней, самой "весомой" 3 2 1 0. Там тpебовался некий
"генеpатоp", я в ней написал функцию "Sled", котоpая выдает следующую более
весомую комбинацию. В пpинципе, можно эту фунцию запустить в цикле, а число
повтоpений цикла бpать из генеpатоpа псевдослучайных.
    Вот та пpогpаммулька:

=== Text:=New(pBufStream,Init('keygen3.pas',stOpenRead,1024)); ===
program keygen;
(*Программа генерирует комбинации из непрерывного ряда символов
от "менее весомого" до "более весомого"*)
uses crt;
var
  F:text;
  kol:longint;
  s0:string;

Function Sled(s:string):string;
var
  uk,uk1,c:byte;
  ch,cho,chn:char;
  sn:string;

  begin
    uk:=length(s)-1;
    while (uk>0) and (Pos(chr(ord(s[uk])+1),s)<uk) do uk:=uk-1;
    if uk=0 then
    begin
      Sled:='';
    end
    else
    begin
      sn:=s;
      ch:=chr(ord(sn[uk])+1);
      sn[uk]:=ch;
      cho:=chr(0);
      for c:=uk+1 to length(s) do
      begin
        chn:=chr(255);
        for uk1:=uk to length(s) do
        begin
          if (s[uk1]<>ch) and (s[uk1]>cho) and (s[uk1]<chn) then chn:=s[uk1];
        end;
        sn[c]:=chn;
        cho:=chn;
      end;
      Sled:=sn;
    end;
  end;

BEGIN
  s0:='';
  while s0<>'0' do
  begin
    writeln('Введите корректную комбинацию , выход - 0');
    readln(s0);
    if s0<>'0' then
    begin
      writeln('Сколько?');
      readln(kol);
      Assign(F, 'com.txt');
      Rewrite(F);
      while kol>0 do
      begin
        s0:=Sled(s0);
        if s0='' Then
        begin
          kol:=0;
          Writeln(F,'Ряд в сторону "увеличения" закончен');
        end
        else
        begin
          Writeln(F,s0);
          kol:=kol-1;
        end
      end;
      Close(F);
    end;
  end;
END.
=== Dispose(Text,Done); ===

                           С кучей пожеланий - Andrew.

--- Ну очень голый GoldED+/386 1.1.5
 * Origin: Страшный-бородатый... (2:5071/59)