Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 19.11.2015
Сообщений: 10

Перестановка без повторений

19.11.2015, 21:56. Показов 2708. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
У меня возникла небольшая проблема при написании программы, буду благодарна за любую помощь.

Задание гласит следующее: Нужно написать программу, которая считывает число и выдаёт все возможные перестановки данного числа без повторений.

Например,
Ввод: 1223
Вывод: 3221 3212 3122 2321 2312 2231 2213 2132 2123 1322 1232 1223

У меня получился следующий код, но , к сожалению, для перестановок с повторениями.

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <iostream>
using namespace std;
 
void ausgeben(char *array, int n)               //выдача результатов
{
 
    for(int i=0; i<n; i++) cout<<array[i];
 
    cout<<" ";
}
 
void tausch(char &x, char &y)                   //смена цифр местами
{
    char temporaer=x;
    x=y;
    y=temporaer;
}
 
void permutation (char *arr, int n, int m)      //перестановка
{
     if(n==1) ausgeben(arr,m);
        else {
            for(int i=0; i<n; i++) {
                tausch(arr[i],arr[n-1]);
                permutation(arr,n-1,m);
                if (arr[i]==arr[n-1]) return;
                tausch(arr[i],arr[n-1]);
            }
        }
 
}
 
void main1()                                        
{
    char zahl[80]=" ";
    cout << "\nВведите число: ";
    cin >> zahl;
    int g;
    for (int i=0; zahl[i]!='\0'; i++) g=1+i;        
 
    cout << "\nПерестановки заданного числа: ";
 
    permutation(zahl,g,g);                         
    cout << endl;
 
 
}
 
int main()                                  //основная область/выборочное меню          
{
    int auswahl;
    cout << "\n Программа, выдающая все перестановки заданного числа"<<endl;
 
    do                                   
    {                                    
        cout << "\n";
        cout << "____________________________________________________\n\n";
        cout << " Если вы хотите запустить программу             - 1\n";
        cout << " Если вы хотите остановить программу            - 0\n";
        cout << "____________________________________________________\n\n";
        cin  >> auswahl;
 
        if (auswahl==1) main1();        
 
    }  while(auswahl!=0);                
return 0;
 
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.11.2015, 21:56
Ответы с готовыми решениями:

Перестановка без повторений
Сгенерировать перестановку N чисел без повторений. Требуется использовать циклы. Функции пока не прошли.

Рандом без повторений
Здравствуйте! Искал по форуме, но так и не нашел подходящее решение такой задачи: пользователь вводит К ПРИМЕРУ число 7. я беру от него...

Перестановки без повторений
Как из этого кода сделать конфетку — чтобы не выводились повторения? #include &lt;iostream&gt; using namespace std; string s; ...

16
 Аватар для Nosey
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
19.11.2015, 22:09
Есть отличная ссылка. Внизу страницы можно переключить на "русский".
http://en.cppreference.com/w/c... ermutation
0
0 / 0 / 0
Регистрация: 19.11.2015
Сообщений: 10
19.11.2015, 22:14  [ТС]
Спасибо, но, к сожалению, нельзя по условию использовать <algorithm>/классы и т.д., так, конечно, было бы гораздо проще. Можно использовать рекурсию, что я и сделала. Но не могу придумать проверку на наличие повторений, дабы их не выводить в дальнейшем.
0
 Аватар для Nosey
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
19.11.2015, 22:28
anixiya, Да, но по ссылке имеется раздел "Possible implementation".
Может поможет вам, а мне лень думать над алгоритмом самому, т.е. откланиваюсь.
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
19.11.2015, 23:00
Лучший ответ Сообщение было отмечено anixiya как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;
 
int m[10];
bool e(int i) {return i ? !m[i-1] && e(i-1) : true;}
void c(int i) {if (i) {m[i-1]=0; c(i-1);}}
void r(int n) {if (n) {m[n%10]++; r(n/10);}}
    
void f(int n) {
    if (e(10)) cout<<n<<" ";
    else for (int i=0; i<10; ++i) if (m[i]) {m[i]--; f(n*10+i); m[i]++;}}
 
int main() {int n; cin>>n; c(10); r(n); f(0); return 0;}
1
0 / 0 / 0
Регистрация: 19.11.2015
Сообщений: 10
20.11.2015, 20:32  [ТС]
_Ivana, Большое спасибо за ответ! Я бы хотела понять код, а не просто списать — не могли бы Вы кратко пояснить, как он "работает"? (если это возможно).
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
20.11.2015, 21:16
anixiya, ваши попытки понимания?
0
0 / 0 / 0
Регистрация: 19.11.2015
Сообщений: 10
20.11.2015, 21:42  [ТС]
_Ivana, так, у нас есть глобальная переменная : массив из 10 элементов. В главной области мы вводим число, потом переходим в функцию заполнения массива нулями, где i изначально = 10. Далее переходим в функцию перезаписи массива в соответствии с заданным числом. Если введенное число, например, 12, то a[2]=1 —> рекурсия —> i=1 - true -> arr[1]=1+1=2 -> рекурсия -> выходим из функции. Потом переход на функцию выдачи результатов/перезаписи массива. Мы проверям, e(10) тру или не тру. Переходим в функцию проверки, (тренарная условная операция) i=10 -> true -> возвращаем значение !arr[9] и рекурсия(9) ... Доходим до 0, возвращаем значение тру, и выводим "12". Дальше переходим в else, ибо значение уже false. И тут я запуталась... Кажется, что-то не так понимаю.
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
20.11.2015, 21:46
Начнем с простого - каков логический смысл/назначение процедур/функций e,c,r?
0
0 / 0 / 0
Регистрация: 19.11.2015
Сообщений: 10
20.11.2015, 21:51  [ТС]
_Ivana,
e — проверка на тру i, если возвращает значение тру, то выдаем результат в f
c — заполнение массива нулями
r — перезапись массива в соответствии с введеным числом
f — выдаём значение, если е тру, если же нет, то перезаписываем массив еще раз + рекурсия
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
20.11.2015, 21:54
e - неправильно совсем
c - правильно. От слова clear - очистка.
r - подробнее опишите суть и назначение функции
f - подождите с ней, разберитесь с простым.
0
0 / 0 / 0
Регистрация: 19.11.2015
Сообщений: 10
20.11.2015, 22:07  [ТС]
_Ivana, r — заполнение массива цифрами, из которого состоит введенное нами число. Допустим, мы ввели значение "12". Тогда n сначала = 12, это тру, значит присваиваем m[12%10=2]=0+1=1;
далее рекурсия(12/10=1). n=1 — это всё еще тру, поэтому присваиваем m[1%10=1]=1+1=2, рекурсия (1/10=0). n=0, это false — выходим из функции.
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
20.11.2015, 22:21
Цитата Сообщение от anixiya Посмотреть сообщение
r — заполнение массива цифрами, из которого состоит введенное нами число
было бы правильно, если бы было точнее и дальше не было написано глупостей.
Цитата Сообщение от anixiya Посмотреть сообщение
m[1%10=1]=1+1=2
неправильно. Введите n=12 (и другие числа попробуйте) и смотрите на результат.
0
0 / 0 / 0
Регистрация: 19.11.2015
Сообщений: 10
20.11.2015, 22:30  [ТС]
_Ivana, попробовала число 4589
n=4589 m[9]=m[9]+1
n=458 m[8]=0+1
n=45 m[5]=0+1
n=4 m[4]=0+1
То есть мы помечаем номера ячеек, которые соответсвуют цифрам введенного числа, единицами. так?
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
20.11.2015, 22:31
Вы попробуйте не одно число, а десяток, пока не придет понимание.
0
0 / 0 / 0
Регистрация: 19.11.2015
Сообщений: 10
20.11.2015, 22:34  [ТС]
_Ivana, последнее сообщение правильное, или?
хорошо, в любом случае спасибо)
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
20.11.2015, 22:38
anixiya, ваше - нет, неправильное.

ЗЫ когда будете разбирать логику работы программ - старайтесь видеть не реализацию, а замысел, не "как" а "что". То есть, алгоритм.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.11.2015, 22:38
Помогаю со студенческими работами здесь

Перестановки без повторений
привет помогите пожалуйста найти файлик в котором бы были все перестановки из 5 элементов. мне нужно проверить правильно...

Перебор без повторений
текст задачи во вложении мой код: #include &lt;iostream&gt; using namespace std; int f(int v) { if (v == 0) return 1; ...

Сочетание без повторений
Нужно вывести все возможные комбинации из 37 цифр без повторений. Тоисть необходимо что бы вывело все комбинации (по 6 цифр) из заданых 37...

Перестановки без повторений
Требуется дописать исключение повторений в коде,спасибо. #include &lt;iostream&gt; using namespace std; const int N =11; int n,a,p; ...

Перестановка строк без цикла
дана произвольная матрица, записанная в файле, необходимо поменять местами две любые строчки этой матрицы, не используя цикл.


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru