Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.03.2016, 20:43   #1
Promi
Пользователь
 
Регистрация: 02.07.2015
Сообщений: 33
По умолчанию Составить из числа наименьшее число, которое делится на 3

Дано натуральное число, содержащее до 50 разрядов. Составить из этого числа наименьшее число, которое делится на 3. Если такое число составить невозможно, то выведите NO.
Promi вне форума Ответить с цитированием
Старый 10.03.2016, 22:13   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

для любого количества разрядов для десятичных чисел действует правило - если сумма цифр числа делится на 3, то и число делится, и верно обратное, если сумма цифр не делится на 3, то и само число не кратно трём.

Т.е. нужно сперва просуммировать все разряды. Проверить полученную сумму, если она не кратна трём - выход с NO
иначе отсортировать массив с числами по возрастанию.
Это и будет минимальное число, которое можно составить из исходного.
Всё, задача решена.

p.s. Написать решение в виде кода надо меньше времени, чем я это своё сообщение сочинял!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.03.2016, 22:23   #3
Promi
Пользователь
 
Регистрация: 02.07.2015
Сообщений: 33
По умолчанию

да, это мне было известно, но у меня не получается написать в виде кода(
Promi вне форума Ответить с цитированием
Старый 10.03.2016, 22:27   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Promi Посмотреть сообщение
да, это мне было известно, но у меня не получается написать в виде кода(
А что получилось написать?
Переменные объявить получилось?
Осуществить ввод нужного 50-значного числа получилось?
Где ваш код?
я не вижу ваших попыток решить задачу.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.03.2016, 22:46   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Здесь формирование наименьшего. Ввод/вывод и проверку делимости на 3 сам делай
Код:
  //в s строка с цифрами
  k:=0;
  for i:=1 to Length(s)-1 do begin
    for j:=i+1 to Length(s) do if s[j]<s[i] then begin c:=s[i]; s[i]:=s[j]; s[j]:=c; end;
    if (s[i]<>'0') and (k=0) then k:=i;
  end;
  if k=0 then k:=Length(s);
  if k>1 then begin s[1]:=s[k]; s[k]:='0'; end;
  //результат в s
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 11.03.2016 в 08:48.
Аватар вне форума Ответить с цитированием
Старый 11.03.2016, 04:40   #6
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от Promi Посмотреть сообщение
Дано натуральное число, содержащее до 50 разрядов. Составить из этого числа наименьшее число, которое делится на 3. Если такое число составить невозможно, то выведите NO.
Код:
int n;// к-во разрядов
........
if(n > 15) {cout<<"NO"; return;}
// здесь делаем перестановки и проверку
Количество перестановок = n!
Для получения всех перестановок 50-и разрядов, компу не хватит ни времени ни ресурсов .
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 11.03.2016, 07:28   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А зачем их получать?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 11.03.2016, 08:23   #8
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
А зачем их получать?
Условие читай (составить наименьшее). Я так понял, составить из цифр, входящих в это число, наименьшее, делящееся на 3.
Если бы вопрос был задан - определить, какая цифра делится на 3? Если таковой нет, найти наименьшую сумму делящуюся на три, тогда полный перебор перестановок был бы не нужен. Ежу понятно, что нужно найти сумму двух - трёх чисел т.к. сумма четырёх, всегда будет больше чем трёх. Нули, естественно не в чёт.
Наименьшая сумма, делящаяся на 3 = 1+2 или 1+1+1.
Перебор нескольких вариантов показывает, что наименьшее суммируемое к-во цифр не превышает трёх.

0000 = No
1111 = 1+1+1= 3
2222 = 2+2+2 = 6
3333 = 3
4444 = 4+4+4 = 12
5555 = 5+5+5 = 15
6666 = 6
7777 = 7+7+7 = 21
8888 = 8+8+8 = 24
9999 = 9

Ну и могут быть комбинации из разных цифр.
Возьмём другой пример:

1875 сумма = 21 - не делится
но минимальное число, составленное из этих цифр = 15 - делится.
1-а стоит в старшем разряде, а 5-а в младшем. Как компу "объяснить", что нужно считать наименьшую сумму? Только перестановками.
После N перестановок число примет вид 7815. Сумма двух последних и будет искомое наименьшее.

Если бы в задании было - определить, делится ли число на 3, тут и вопросов-бы небыло. Подсчитываем сумму всех цифр и делим на 3. Если в остатке 0 - делится, не ноль - не делится.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 11.03.2016 в 09:01.
Smitt&Wesson вне форума Ответить с цитированием
Старый 11.03.2016, 08:46   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Ну вот число 710052, оно делится на 3.
Наименьшее число из этих цифр 100257 без всяких перестановок и оно тоже делится на 3
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 11.03.2016, 09:10   #10
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Ну вот число 710052, оно делится на 3.
Наименьшее число из этих цифр 100257 без всяких перестановок и оно тоже делится на 3
Не правда. Минимальная делящаяся на 3 сумма = 1 + 2 = 3
У тебя тоже числа переставлены. Как его получить без перестановок?
И у тебя оно не наименьшее. Наименьшим будет 001257.
Добиваемся простой сортировкой по возрастанию.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 11.03.2016 в 09:16.
Smitt&Wesson вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какое наименьшее число Z можно получить вставкой цифры X в четырёхзначное число Y. Drunk Gnome Паскаль, Turbo Pascal, PascalABC.NET 3 15.11.2014 20:57
Функция, которая генерирует число в диапазоне от 0 до числа, которое передается ей в качестве параметра harvey Помощь студентам 1 28.03.2013 21:58
Даны натуральные K и L. Определить, делится ли K нацело на L. Если делится, то заменить эти числа их квадратами, в противном случ Proskurina Помощь студентам 1 27.03.2013 21:39
два натуральных числа. Верно ли, что их наименьшее общее кратное есть нечетное число monokol Паскаль, Turbo Pascal, PascalABC.NET 2 21.12.2011 15:53
Ввести число N и определить делится ли оно без остатка на число M (VBA) Ivanich Microsoft Office Excel 7 24.04.2008 19:43