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)