Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/67: Рейтинг темы: голосов - 67, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 09.05.2009
Сообщений: 72
1

Найти все возможные перестановки цифр

12.02.2010, 01:35. Показов 13004. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
дано 6-розрядное число...надо найти все возможные перестановки цыфр...как ето организовать???помогите пожалуста!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.02.2010, 01:35
Ответы с готовыми решениями:

Распечатать все перестановки из N цифр
Задача такая. Допустим для простоты дано 5 цифр. Причем цифры могут быть и одинаковые, например...

Найти все возможные комбинации пятизначного числа.
Есть задача: во-первых, найти кол-во возможных комбинаций пятизначного числа, находящегося в...

Вывести все возможные перестановки N заданных цифр, формируя при этом последовательность из K цифр
Дана задача: Вывести все возможные перестановки N заданных цифр формируя при этом...

Ввести число. Используя рекурсивную функцию, получить все возможные перестановки цифр этого числа
Помогите пожалоста..........Заранеє спасибо

12
Автор FAQ
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
12.02.2010, 02:13 2
В это время могу предложить лишь такую реализацию
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int x = 123456;
char str[7] = { 0 };
itoa(x, &str[0], 10);
for (int i = 0; i < 7; i++
{
   for (int j =0; j < 7; j++)
   {
       if ( i != j )
       {
          // тут нужно поменять в строке i и j символы
          // Распечатать эту строку
          // поменять эти символы обратно чтобы строка приняла исходный вид
       }
}
0
0 / 0 / 0
Регистрация: 09.05.2009
Сообщений: 72
12.02.2010, 15:05  [ТС] 3
можна и по другому поставить задачу..найти все возможные перестановки елементов масыва с 6 елементов!!!!!

Добавлено через 1 час 26 минут
не роботает!!!
0
Автор FAQ
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
12.02.2010, 18:32 4
Конечно не работает, замените комментарии на реальные действия. Это алгоритм а не готовый код. Готовые коды делают в соответствующих разделах. А алгоритм просто делает все возможные перестановки. Вернее алгоритм в цикле меняет 2 числа - номера элементов. Если номера элементов разные - значит их можно поменять местами Меняем - печатаем.
0
0 / 0 / 0
Регистрация: 09.05.2009
Сообщений: 72
12.02.2010, 18:49  [ТС] 5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <stdio.h>
#include <conio.h>
void new1 (int *);
void print(int*);
void rek(int);
void main(void)
{
    int n,temp;
    int m[4]={1,2,3,4};
    int i,j;
    clrscr();
    for(i=0;i<4;i++) {
        for(j=0;j<4;j++) {
            if(i!=j) {
                 temp=m[i];
                 m[i]=m[j];
                 m[j]=temp;
                 print(m);
                 new1(m);
            }
        }
        printf("\n");
    }
 
}
void print(int *m)
{
    int i;
    for(i=0;i<4;i++)
        printf("%d  ",m[i]);
        printf("/");
}
void new1(int *m)
{
    int i;
    for(i=0;i<4;i++)
        m[i]=i+1;
}
так????
0
Автор FAQ
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
12.02.2010, 18:54 6
Мне кажется немного не так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
for(i=0;i<4;i++)
{
      for(j=0;j<4;j++)
      {
         if(i!=j)
         {
            temp=m[i];
            m[i]=m[j];
            m[j]=temp;
            printf("%d ",m[i]);
            temp=m[i];
            m[i]=m[j];
            m[j]=temp;
         }
      }
}
Помещайте код в [CODE]... тут код ...[/CODE] для того чтобы код был читабельным
0
Day
1179 / 989 / 83
Регистрация: 29.10.2009
Сообщений: 1,385
15.02.2010, 18:26 7
insideone, если взять 6-элементное множество, то перестановок должно быть 6! = 720
А по твоему алгоритму (for.. j<6...) получится только 6*6 - 6 = 30
1
Автор FAQ
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
15.02.2010, 18:39 8
Хм... я тут подумал как это можно сделать. А если элементы соединить в связанный список и перебирать так
запоминаем указатель на начало списка. изначальный список АБВГД. потом отрываем Д приклеиваем к А,получаем ДАБВГ. и так дальше до тех пор пока не вернемся а АБВГД (для этого мы запомнили указатель на начало списка). Тут меняем 1ый символ списка на 2ой символ и опять повторяем вышеизложенную операцию. Потом 1ый на 3ий... и т.д.
Так получится? Или как ещё можно если не так?
0
Day
1179 / 989 / 83
Регистрация: 29.10.2009
Сообщений: 1,385
15.02.2010, 19:45 9
Лучший ответ Сообщение было отмечено как решение

Решение

Ничего умнее, чем сделать вот такую рекурсию, не придумал
Но, вроде бы, работает.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
static char X[7];
Pere(char *p, int k)
{ char q[7]; int i, j, jj;
   if (k==1) {
      X[6-k] = *p;
      X[6] = '\0';
      printf("%s\n", X);
      return;
   }
   for(i=0; i<k; i++) {
      X[6-k] = p[i];
      for(j=0, jj=0; j<k; j++)
        if (j!=i) q[jj++] = p[j];
      Pere(q, k-1);
   }
}
/*************/
main()
{
 char s[7] = "123456";
 Pere(s, 6);
}
/*****************/
5
Day
1179 / 989 / 83
Регистрация: 29.10.2009
Сообщений: 1,385
17.02.2010, 11:45 10
Лучший ответ Сообщение было отмечено как решение

Решение

Вот такой симпатичный алгоритм генерации перестановок без всяких рекурсий.
Э.Рейнгольд, Ю.Нивельгерт, Н.Део "Комбинаторные алгоритмы" 1980
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
#define N 6
main()
{ char s[N+1], t; int i, j, r, k;
 for(i=0; i<N; i++) s[i] = '1'+i;
 s[N] = '\0';
 while(1) {
   printf("%s\n", s);  // Вывод очередной перестановки
       // Находим самое правое место, где s[i] < s[i+1]
   for(i=N-1; i>=0 && s[i] > s[i+1]; i--) ;
   if (i<0) break; // Уже получили "654321" - самую старшую перестановку
       // Находим s[j] - наименьший элемент справа от s[i] и больший его
   for(j=N-1; s[i] > s[j]; j--) ;
       // Меняем s[i] <-> s[j]
   t = s[j];
   s[j] = s[i];
   s[i] = t;
       // То, что за "i" - переворачиваем
   for(k=i+1, r=N-1; r > k; k++, r--) {
     t = s[r];
     s[r] = s[k];
     s[k] = t;
   }
 }
}
/*****************/
6
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
15.11.2010, 18:58 11
Day, а можете предложить вариант, чтобы символы распологались не друг за другом в таблице, т.е. наприме "fas" и т.д. (а не "abcd" или "1234")
0
Day
1179 / 989 / 83
Регистрация: 29.10.2009
Сообщений: 1,385
15.11.2010, 19:38 12
go, вот это место измени по вкусу

Код C
1234

Чушь какая-то.
Сбой.
Не до того
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
05.11.2018, 11:17 13
Есть еще такая задача. Пусть все перестановки расположены в лексикографическом порядке. По номеру k найти k-тую перестановку. (Не выписывая все, конечно). Где-то на форуме она решалась. (сейчас не найду) Так вот, на основе решения этой задачи легко решается и данная.
Без претензий на оптимальность.
0
05.11.2018, 11:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.11.2018, 11:17
Помогаю со студенческими работами здесь

Найти все возможные перестановки
Условие задачи состоит в том что у нас есть кинотеатр, и там показывают 3 фильма &quot;1&quot;, &quot;2&quot;, &quot;3&quot;....

Найти все возможные перестановки элементов массива
Вроде задание не сложно, но не могу найти понятное и не сложное решение. Необходимо найти все...

Нужно найти все возможные перестановки элементов массива
думаю что кто то уже решал подобное и надеюсь что поделиться. Допустим имеются три элемента 1;2;3....

Выведите на экран все возможные трехзначные числа, полученные путем перестановки цифр трехзначного числа, вводимого с клавиатуры
Выведите на экран все возможные трехзначные числа, полученные путем перестановки цифр трехзначного...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru