Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/34: Рейтинг темы: голосов - 34, средняя оценка - 4.59
0 / 0 / 0
Регистрация: 10.12.2017
Сообщений: 7

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

17.01.2018, 11:35. Показов 6977. Ответов 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
5095 / 2661 / 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
5095 / 2661 / 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
5095 / 2661 / 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
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru