0 / 0 / 0
Регистрация: 19.04.2015
Сообщений: 14
1

Вывести все возможные комбинации цифр заданного числа

19.04.2015, 20:30. Показов 4964. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Введено число. Вывести все возможные комбинации цифр данного числа. Просьба разобраться в каждой строчке этого кода
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
            Console.WriteLine("Введите число");
            Ar = Console.ReadLine().ToCharArray();
            Console.WriteLine();
 
            for (int i = 0; i < Ar.Length; i++)
            {
                Li.Clear();
                Li.Add(i);
                res = "" + Ar[i];
                AddChar(1);
            }
            Console.ReadLine();
        }
        static void AddChar(int n)
        {
            res = res.Substring(0, n);
            for (int i = 0; i < Ar.Length; i++)
            {
                Li.RemoveRange(n, Li.Count - n);
                if (Li.IndexOf(i) < 0)
                {
                    Li.Add(i);
                    res = res.Substring(0, n);
                    res += Ar[i];
                    if (n == Ar.Length - 1)
                    {
                        if (Ls.IndexOf(res) < 0)
                        {
                            Ls.Add(res);
                            Console.WriteLine(res);
                        }
                    }
                    else AddChar(n + 1);
                }
            }
        }
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.04.2015, 20:30
Ответы с готовыми решениями:

Консоль. Вывести все возможные комбинации цифр данного числа
Введено число. Вывести все возможные комбинации цифр данного числа.

Вывести все возможные числа из нескольких цифр
Необходимо вывести все возможные числа из цифр: 1,2,3,4,5 - начиная от цифры &quot;23 000&quot;. Спасибо за...

Вывести все возможные комбинации 5 из 50
Здравствуйте,у меня есть список номеров ...

Вывести все возможные комбинации 6 из 50
Здравствуйте,у меня есть список номеров...

8
4 / 4 / 0
Регистрация: 28.03.2015
Сообщений: 82
19.04.2015, 20:59 2
а какой надо ответ?)
0
1452 / 845 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
19.04.2015, 22:04 3
Я немного отрефакторил код и сделал его рабочим:


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
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApplication1
{
    class Program
    {
        private static char[] _charArray;
        private static List<int> _ints = new List<int>();
        private static string _result = String.Empty;
 
        static void Main(string[] args)
        {
            Console.WriteLine("Введите число");
            _charArray = Console.ReadLine().ToCharArray();
            Console.WriteLine();
 
            for (int i = 0; i < _charArray.Length; i++)
            {
                _ints.Clear();
                _ints.Add(i);
                string res = _charArray[i].ToString();
                AddChar(res, 1);
            }
 
            Console.ReadLine();
        }
 
 
        static void AddChar(string line, int n)
        {
            line = line.Substring(0, n);
            for (int i = 0; i < _charArray.Length; i++)
            {
                _ints.RemoveRange(n, _ints.Count - n);
                if (_ints.IndexOf(i) < 0)
                {
                    _ints.Add(i);
                    line = line.Substring(0, n);
                    line += _charArray[i];
                    if (n == _charArray.Length - 1)
                    {
                        if (_result.IndexOf(line) < 0)
                        {
                            _result += line;
                            Console.WriteLine(line);
                        }
                    }
                    else AddChar(line, n + 1);
                }
            }
        }
    }
}
1
0 / 0 / 0
Регистрация: 19.04.2015
Сообщений: 14
20.04.2015, 08:00  [ТС] 4
можете объяснить, что обозначает каждая строчка в этом коде, не все понимаю...
0
103 / 90 / 19
Регистрация: 15.04.2015
Сообщений: 353
20.04.2015, 10:32 5
C#
1
2
3
4
5
6
7
for (int i = 0; i < Ar.Length; i++)
            {
                Li.Clear();
                Li.Add(i);
                res = "" + Ar[i];
                AddChar(1);
            }
Вот это особо доставило. Список-то чистится в каждой итерации. Добавление новых элементов в него в этом случае теряет весь смысл. Разве что после последней итерации там останется один элемент.
0
48 / 48 / 10
Регистрация: 22.02.2012
Сообщений: 137
20.04.2015, 10:39 6
Цитата Сообщение от Мадлен Посмотреть сообщение
Просьба разобраться в каждой строчке этого кода
Разобрался. Не стоит благодарности)
0
0 / 0 / 0
Регистрация: 19.04.2015
Сообщений: 14
20.04.2015, 21:40  [ТС] 7
агаа разобрались сами, помогите теперь мне

Добавлено через 3 часа 53 минуты
помогите разобраться в коде
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
static char[] Ar;
        static string res;
        static List<string> Ls = new List<string>();//список для введенных чисел
        static List<int> Li = new List<int>();//список для индексов 
 
        static void AddChar(int n)
        {
            res = res.Substring(0, n);
            for (int i = 0; i < Ar.Length; i++)
            {
                Li.RemoveRange(n, Li.Count - n);//удаляет даипазон элементов 
                if (Li.IndexOf(i) < 0)//проверяет есть ли такая комбиниция
                {
                    Li.Add(i);//добавляет элемент с индексом
                    res = res.Substring(0, n);//извлекает подстроку 
                    res += Ar[i];//записывает в массив
                    if (n == Ar.Length - 1)
                    {
                        if (Ls.IndexOf(res) < 0)
                        {
                            Ls.Add(res);//записывает комбинацию в список для чисел
                            Console.WriteLine(res);
                        }
                    }
                    else AddChar(n + 1);
                }
            }
        }
Console.WriteLine("Введите символы: ");
            Ar = Console.ReadLine().ToCharArray();
            Console.WriteLine();
            
            for (int i = 0; i < Ar.Length; i++)
            {
                Li.Clear();
                Li.Add(i);
                res = "" + Ar[i];
                AddChar(1);
            }
            Console.ReadLine();
        }

Добавлено через 1 минуту
Цитата Сообщение от FesS92 Посмотреть сообщение
Разобрался. Не стоит благодарности)
а мне , а мне помочь?
0
48 / 48 / 10
Регистрация: 22.02.2012
Сообщений: 137
22.04.2015, 09:09 8
Лучший ответ Сообщение было отмечено Мадлен как решение

Решение

Обычный рекурсивный обход в лексико-графическом порядке (если на вход подается упорядоченный массив).

В основной программе мы задаем начальные параметры для рекурсии.
Комбинация набирается посимвольно. Сначала берется первый из возможных символ, как следующий.. Потом второй и так обычным перебором.
Li (или по задумке автора List of Indexes) содержит позиции символов, которые уже участвуют в комбинации.
C#
1
2
Li.Clear();
Li.Add(i);
Очищаем, и сразу кладем первый символ.

C#
1
res = "" + Ar[i];
Запускаем рекурсию с начального i-го символа (в AddChar подается текущая длина строки, после которой удаляются "лишние")
C#
1
AddChar(1);
Res (или по задумке автора Result) хранит текущую комбинацию, которая по условию в функции AddChar(..)
C#
1
n == Ar.Length - 1

Не по теме:

(Что значит длина накопленной последовательности равна длине введенной строки с клавы)


добавляется в список результатов Ls, если конечно его там еще нет (комбинации могут повториться...)
C#
1
2
3
4
5
if (Ls.IndexOf(res) < 0)
{
    Ls.Add(res);//записывает комбинацию в список для чисел
    Console.WriteLine(res);
}
если же текущая строка короче, чем исходная, то добавляем к ней следующий символ, уходим в рекурсию...
C#
1
else AddChar(n + 1);
Остальные же строки кода - являются обязательными для осуществления такой рекурсии)

Не по теме:

За код ставлю троечку, за красивые глаза - может даже и твердую)

1
0 / 0 / 0
Регистрация: 19.04.2015
Сообщений: 14
22.04.2015, 22:30  [ТС] 9
Огромное вам спасииибо!!
0
22.04.2015, 22:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.04.2015, 22:30
Помогаю со студенческими работами здесь

Вывести все возможные комбинации 5 из 10
Здравствуйте,хочу сделать программу в которую буду писать 10 цифр от 1 до 50,потом вывести все...

Перебрать все возможные комбинации цифр, потом совершить то же самое со строкой
Задача: Перебрать все комбинации, на подобии: 0011 0110 0101 1010 1001 1100 Только для...

Вывести все возможные комбинации чисел
Здравствуйте, помогите с задачкой пожалуйста. от 1-го до n нужно вывести все возможные варианты,...

Программа проверяющая все возможные комбинации заданного числа
Нужно написать программу которая проверит все возможные комбинации заданного числа(пользователь...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru