0 / 0 / 0
Регистрация: 10.12.2017
Сообщений: 7

Перестановка цифр трехзначного числа

17.01.2018, 11:35. Показов 7021. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Комбинаторика. Перестановка цифр трехзначного числа.
Необходимо найти все числа, образуемые путём перестановки цифр исходного числа.
Ниже код, написанный чайником.
А как бы решить задачу красиво?
Подскажите пожалуйста.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var 
   A, B, C, K:integer;
begin
  write(' Введите трехзначное число ');
  readln(K);
  A:=(K div 100);
  B:=((K-A*100)div 10);
  C:=(K-A*100 -b* 10);
  writeln(A,C,B);
  writeln(B,A,C);
  writeln(B,C,A);
  writeln(C,A,B);
  writeln(C,B,A);
end.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.01.2018, 11:35
Ответы с готовыми решениями:

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

Найти сумму цифр целого трехзначного числа
написать программу для нахождения суммы цифр целого трехзначного числа

Получить шесть чисел, образованных при перестановке цифр трехзначного числа
PascalABC.NET ПОМОГИТЕ ПОЖАЛУЙСТА Условия. Дано трехзначное число в котором все цифры различны. Получить шесть чисел, образованных при...

10
Эксперт Pascal/Delphi
6812 / 4568 / 4820
Регистрация: 05.06.2014
Сообщений: 22,433
17.01.2018, 13:39
Перестановка цифр в числе
0
0 / 0 / 0
Регистрация: 10.12.2017
Сообщений: 7
17.01.2018, 21:39  [ТС]
Я привел выше корявое решение задачи, так как руками сам
написал чередование цифр, а Паскаль только лишь вывел
результат на экран. Но нужен алгоритм который
перебирает различные варианты перестановок.
Если А,B,C задать в виде типа char, то алгоритм
перестановок такой:

Pascal
1
2
3
4
5
6
7
8
9
10
var
a, b, c: char;
begin
 for a := 'A' to 'C' do
 for b := 'A' to 'C' do
 for c := 'A' to 'C' do
            
  if (a <> b) and (a <> c) and (b <> c) then
  Writeln(a, b, c);
    end.
Но как буквы заменить на произвольные цифры?
0
Эксперт Pascal/Delphi
2388 / 1300 / 1492
Регистрация: 29.08.2014
Сообщений: 4,665
18.01.2018, 06:12
Цитата Сообщение от EugeneL Посмотреть сообщение
Но как буквы заменить на произвольные цифры?
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
var
  a:array[1..3] of byte;
  i,j,k:integer;
  n:string;
begin
  n:=inttostr(ReadlnInteger('n='));
  for i:=1 to 3 do a[i]:=ord(n[i])-48;
  for i:=1 to 3 do
    for j:=1 to 3 do
      for k:=1 to 3 do
        if (i<>j) and (i<>k) and (j<>k) then writeln(a[i],a[j],a[k]);
end.
Добавлено через 1 минуту
Цитата Сообщение от EugeneL Посмотреть сообщение
writeln(A,C,B);
* writeln(B,A,C);
* writeln(B,C,A);
* writeln(C,A,B);
* writeln(C,B,A);
writeln(A,B,C) забыл?

Добавлено через 17 минут
или на 1 цикл меньше
Pascal
1
2
3
4
5
6
7
8
9
10
var
  a:array[1..3] of byte;
  i,j:integer;
  n:string;
begin
  n:=inttostr(ReadlnInteger('n='));
  for i:=1 to 3 do a[i]:=ord(n[i])-48;
  for i:=1 to 3 do
    foreach j in [1..3]-[i] do writeln(a[i],a[j],a[6-i-j]);
end.
0
 Аватар для JuriiMW
5096 / 2662 / 2355
Регистрация: 10.12.2014
Сообщений: 10,060
18.01.2018, 06:27
Лучший ответ Сообщение было отмечено ZX Spectrum-128 как решение

Решение

Вот универсальный способ с рекурсией:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
var S : String;
 
procedure Generate(L, R : Integer);
begin
  if L = R then WriteLn(S)
  else for var i := L to R do begin Swap(S[i],S[L]); Generate(L+1,R); Swap(S[i],S[L]); end;
end;
 
begin
  S := Abs(ReadInteger('n =')).ToString;
  Generate(1, S.Length);
end.
n может быть любым допустимым числом.
Только в нём должны быть все цифры различны… ;–(
Чтобы генерировать только „уникальные перестановки“, нужно их запоминать… Ну хотя бы в строке:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
const delim = '¤';
var S, Store : String;
 
procedure Generate(L, R : Integer);
begin
  if (L = R) and (Store.IndexOf(S+delim) < 0) then begin WriteLn(S); Store+=S+delim; end
  else for var i := L to R do begin Swap(S[i],S[L]); Generate(L+1,R); Swap(S[i],S[L]); end;
end;
 
begin
  S := ReadString('>');
  Generate(1, S.Length);
end.
1
0 / 0 / 0
Регистрация: 10.12.2017
Сообщений: 7
21.01.2018, 11:29  [ТС]
Joy и JuriiMW, большое спасибо за предложенные решения!!!
0
58 / 42 / 21
Регистрация: 01.01.2018
Сообщений: 273
23.01.2018, 23:24
Не надо запоминать все строки, что вы? Все прекрасно работает вот так:

Pascal
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
type
  arr = array [0..9] of integer;
 
var
  A: arr;
  chislo, err: integer;
  c:string;
 
procedure output(B: arr; n: integer; s:string);
begin
  for var i: integer :=0 to 9 do
    if ((n<>1) or (i<>0)) and (B[i] > 0) then 
    begin
      if s.Length=n then s:=s.Remove(n-1,1);
      if n mod c.length=0 then writeln(s+i);
      s+=i;
      B[i] -= 1;
      output(B, n + 1, s);
      B[i] +=1;
    end;
end;
 
begin
  c := readstring;
  for var i: integer := 1 to c.Length do
  begin
    val(c[i], chislo, err);
    A[chislo] += 1;
  end;
  writeln;
  output(A, 1, '');
end.
P.S.: У меня могут быть хорошие идеи, но кривой код. Критика и того и другого приветствуется

Добавлено через 11 минут
Работает с числами, не превышающими длину строки (еще больше, чем longint).
Не считает число новым при перестановке одинаковых элементов.
Убираешь эту строчку и числа могут начинаться с 0:
Pascal
1
((n<>1) or (i<>0)) and
Добавлено через 1 час 1 минуту
Цитата Сообщение от JuriiMW Посмотреть сообщение
Чтобы генерировать только „уникальные перестановки“, нужно их запоминать… Ну хотя бы в строке:
Если таким образом запоминать числа ("1343¤1334¤1433¤3143¤3134..."), то переполнение строки произойдет ну ооочень быстро. Тогда уж лучше целый массив строк, но штука всяко выходит малоэффективная.

Добавлено через 13 минут
Уже при входных данных "123456789" программа выводит далеко не все варианты. В контексте задачи, конечно, подходит, но вот на тех же олимпиадах не прокатит
0
 Аватар для JuriiMW
5096 / 2662 / 2355
Регистрация: 10.12.2014
Сообщений: 10,060
24.01.2018, 06:37
Цитата Сообщение от Ksardas_178 Посмотреть сообщение
то переполнение строки произойдет ну ооочень быстро.
Тему прочтите 8–0

„Трёхзначные!“

Хотя для значения 123456789 строка будет занимать всего какие-то три с половиной мегабайта…
Да по нынешним временам это: тфу! и растереть.
Это, в других паскалях может и приведёт к переполнению. Но не в PABC.NET.
0
58 / 42 / 21
Регистрация: 01.01.2018
Сообщений: 273
24.01.2018, 23:18
Вопрос не в "каких-то трёх мегабайтах", а в неверном результате при вводе этого числа. Программа просто не учитывает все варианты.

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

А вот про переполнение наврал, признаю. Не так давно с турбо слез, сложно привыкнуть к такой свободе.
0
 Аватар для JuriiMW
5096 / 2662 / 2355
Регистрация: 10.12.2014
Сообщений: 10,060
25.01.2018, 09:35
Цитата Сообщение от Ksardas_178 Посмотреть сообщение
в неверном результате при вводе этого числа
Так при „вводе“ или „выводе“?
Ну и пример в студию!
0
58 / 42 / 21
Регистрация: 01.01.2018
Сообщений: 273
25.01.2018, 22:10
Пример давно в студии. Вводимое число не изменилось. "123456789". Программы у вас есть, не смею задерживать.

Добавлено через 8 часов 1 минуту
Хотя здесь я, скорее всего, неправ. Зато можно сравнить быстродействие программ при вводе, скажем, числа "111122223333".
Здесь Ваш вариант ощутимо проигрывает

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

Сумма каких либо двух цифр заданного трехзначного натурального числа n равна третьей цифре
сумма каких либо двух цифр заданного трехзначного натурального числа n равна третьей цифре

Определить,равен ли квадрат заданного трехзначного числа кубу суммы цифр этого числа
Определить,равен ли квадрат заданного трехзначного числа кубу суммы цифр этого числа(решить с помощью условия)

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

Определить, равен ли квадрат заданного трехзначного числа кубу суммы цифр этого числа
Вывести на экран 1 или 0 в зависимости от того, ровный квадрат заданного трехзначного числа кубу суммы цифр этого числа.

Сумма цифр трехзначного числа кратна 7, само число также делится на 7. Найдите все такие числа
Сумма цифр трехзначного числа кратна 7, само число также делится на 7. Найдите все такие числа.


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

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

Новые блоги и статьи
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru