Re: Перебор чисел

From
Dmitriy Gerasimenko ()
To
Eugene Anuchin
Date
2002-07-23T11:22:25Z
Area
RU.ALGORITHMS
From: "Dmitriy Gerasimenko" <gerasimenko@karelia.ru>


Hi, Eugene!

>  DG> У меня подозрения, что твой алгоритм  не разрешает размножаться
>  DG> символам в исходной строке, то есть он другой. Мой алгоритм похож на
>  DG> электросчётчик, или на спидометр в автомобиле если угодно.
>  DG> Соответсвенно, по моёй формуле количество перестановок твоего числа
"0123456789" =
>  DG> 10^10

> EA > А какой тогда здесь вообще алгоритм?!
> EA > Просто пробегаем все значения от 0 до 10^10-1 (0000000000-9999999999)

А кто вообще говорил что это должны быть обязательно числа ???........
Никто вроде не говорил! Всё немного сложнее и интереснее чем кажется.

Для твоего числа - "0123456789" можно конечно цикл организовать . Это верно.
А для чисел: "45689", "987540", "98763210" т.е. у тех у которых числа не
попорядку,
как прикажешь цикл организовывать ???!!
А для символов: "KADY", "WOUCJKB", "QWERTY" организовать цикл т.е.
"пробежать"
тоже не получится!

Ну а коли так! То цикл тут не поможет, и применять следует ПЕРЕСТАНОВКУ!

> EA > А какой тогда здесь вообще алгоритм?!

Ну а если применить следует ПЕРЕСТАНОВКУ, то это ни что иное
как алгоритм перестановки.

 EA> Для строки '0123456789' выдает честных 3628800
 EA> перестановок менее чем за секунду (ессно без вывода на консоль)


> EA> Как это нет?!!! Печать идет на стандартное устройство вывода (по
умолчанию -
> EA> консоль). Можно перенаправить в файл (перестановки.com > отчет.txt)

Тебя не понять, сначала ты пишешь что вывода на консоль нет, потом ,что
есть!? Определись!

Далее...
хорошо, вот то, что ты имеешь в виду, но не имею в виду я:
это БЕЗ рекурсии, но есть и С рекурсией....
//--------------------------------------------------------------------------
---------------------------------------------------
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
#include <string.h>

void reconstruct(char *s)
{
  long   i,t;
  char *as, *bs, *cs;
  char *dup_str;

  as = bs = s;
  i = 0;

  dup_str = strdup(s);

  do
  {
 while (*++bs)
 {
  t = *as;
  *as = *bs;
  as++;
  *as = t;
  fprintf(stdout, "%d\t: %s\n", ++i, s);
 }
 as = bs = s;

  } while (strcmp(dup_str, s) != 0);

  free(dup_str);
}

int main(int c, char **argv)
{
  if (c <= 1)
  {
 fprintf(stderr, "Bad argument. [%s [string]]\n", argv[0]);
 return 0;
  }

  clrscr();

  reconstruct( argv[1] );

  return 0;
}
//--------------------------------------------------------------------------
---------------------------------------------------
Результат вывода для числа:
[1234]

1 : 2134
2 : 2314
3 : 2341
4 : 3241
5 : 3421
6 : 3412
7 : 4312
8 : 4132
9 : 4123
10 : 1423
11 : 1243
12 : 1234
//--------------------------------------------------------------------------
---------------------------------------------------

На сим заканчиваю...

..... алгоритмы разные нужны, алгоритмы разные важны.............


--- ifmail v.2.15dev5
 * Origin: UNKNOWN (2:5020/400)