Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 6 186

/ вопрос решён /

Приветствую, уважаемые эксперты!
Решите, пожалуйста, задачу по дискретной математике.
Текст задачи: Написать программу, которая генерирует все k-значные числа, не содержащие одинаковых цифр, кратные 2 и 3 (k<=10).

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

Мамонова Елена Николаевна Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задала: Мамонова Елена Николаевна (статус: Посетитель)
Вопрос отправлен: 10 июня 2012, 12:41
Состояние вопроса: решён, ответов: 1.

Ответ #1. Отвечает эксперт: min@y™

Ладно, исключительно от безделья и тоски.

{ Написать программу, которая генерирует все k-значные числа, не содержащие
  одинаковых цифр, кратные 2 и 3 (k<=10).}
 
program p6186;
 
{$APPTYPE CONSOLE}
 
uses
  Math;
 
const
  k = 3; // задал костантой, вводить с клавы влом :)
         // при k = 8 прога отрабатывает за ~4 секунды (Intel Core2Duo, 2,7 ГГц)
         // при k = 10 консоль виснет секунд через 10, предупреждаю.
 
var
  Value, Limit, Temp: Cardinal;
  Digit: Byte;
  Digits: set of 0..9;
 
begin
  Value:= Round(IntPower(10, k - 1)); // 100 при k = 3
  Limit:= Value * 10;                 // 1000 при k = 3
 
  // ищу первое число, которое делится на 6
  while (Value < Limit) and (Value mod 6 <> 0) do
    Inc(Value);
 
  // перебираю все числа, кратные 6-ти
  // и выбираю те, в которых цифры не повторяются
  while Value < Limit do
    begin
      Digits:= [];
      Temp:= Value;
 
      repeat
        Digit:= Temp mod 10; // беру цифру
 
        if Digit in Digits   // проверка цифры на уникальность
          then Break
          else Include(Digits, Digit);
 
        Temp:= Temp div 10;  // перехожу к след. цифре
      until Temp = 0;
 
      if Temp = 0
        then WriteLn(Value);
 
      Inc(Value, 6);
    end;
 
  ReadLn;   
end.

Мдя, при k = 10 число в 32 бита не влазит. Поэтому и проблемы.

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 12 июня 2012, 10:50
Оценка за ответ: 5

Комментарий к оценке: Огромнейшее спасибо!

Мини-форум вопроса

Всего сообщений: 9; последнее сообщение — 12 июня 2012, 12:39; участников в обсуждении: 2.

10 июня 2012, 18:57: Вопрос перемещён из тематического раздела Pascal » Программирование на Pascal в раздел Лабораторный практикум » Pascal модератором min@y™

min@y™

min@y™ (статус: Доктор наук), 10 июня 2012, 18:58 [#1]:

Ну чо, мужики! Решите девчонке задачку!
А то я уже старый, шоб такой фигнёй по выходным заниматься... :)
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Толяныч

Толяныч (статус: 4-ый класс), 11 июня 2012, 23:28 [#2]:

А что с этими числами делать ? На экран выводить или в файл пихать ? Представляю, как комп будет матом ругаться для k=20, к примеру. С нуля могут начинаться ? Не зная броду, не тронь колоду.
min@y™

min@y™ (статус: Доктор наук), 12 июня 2012, 09:52 [#3]:

Цитата (Толяныч):

Представляю, как комп будет матом ругаться для k=20

Ну написано жеж k<=10. В 4 байта влезет.

Цитата (Толяныч):

С нуля могут начинаться ?

Справедливый вопрос. Ставлю $1 на то, что не могут.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Толяныч

Толяныч (статус: 4-ый класс), 12 июня 2012, 11:01 [#4]:

min@y™:
Вчитываться в код - у меня сегодня бошка не варит, но судя по коментару, у тебя "2 и 3" воспринимаются именно в математическом смысле ( кратны 2 & кратны 3 ) - но почему бы тогда не написпали "кратны 6" ? Мне кажется, что в обычном ( бытовом ) смысле И воспринимается как математическое ИЛИ :
" выпишите все числа, кратные 2 ( четные ) И числа, кратные 3", т.е. объединение, а не пересечение множеств.
Вот так на мелкой задачке рождаются крупные мысли :-)
min@y™

min@y™ (статус: Доктор наук), 12 июня 2012, 11:05 [#5]:

Цитата (min@y™):

Мдя, при k = 10 число в 32 бита не влазит. Поэтому и проблемы.


Переделал, шоб работало:
{ Написать программу, которая генерирует все k-значные числа, не содержащие
  одинаковых цифр, кратные 2 и 3 (k<=10).}
 
program p6186;
 
{$APPTYPE CONSOLE}
 
const
  k = 10; // задал костантой, вводить с клавы влом :)
          // при k = 8 прога отрабатывает за ~4 секунды (Intel Core2Duo, 2,7 ГГц)
          // при k = 10 ждать терпения не хватило, думаю, минуты 3-4 надо.
 
var
  Value, Limit, Temp: Int64;
  Digit, Exponent: Byte;
  Digits: set of 0..9;
 
begin
  Value:= 1;
  for Exponent:= 1 to k - 1 do
    Value:= Value * 10;               // 100 при k = 3
 
  Limit:= Value * 10;                 // 1000 при k = 3
 
  // ищу первое число, которое делится на 6
  while (Value < Limit) and (Value mod 6 <> 0) do
    Inc(Value);
 
  // перебираю все числа, кратные 6-ти
  // и выбираю те, в которых цифры не повторяются
  while Value < Limit do
    begin
      Digits:= [];
      Temp:= Value;
 
      repeat
        Digit:= Temp mod 10; // беру цифру
 
        if Digit in Digits   // проверка цифры на уникальность
          then Break
          else Include(Digits, Digit);
 
        Temp:= Temp div 10;  // перехожу к след. цифре
      until Temp = 0;
 
      if Temp = 0
        then WriteLn(Value);
 
      Inc(Value, 6);
    end;
 
  ReadLn;   
end.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 12 июня 2012, 11:07 [#6]:

Цитата (Толяныч):

Мне кажется, что в обычном ( бытовом ) смысле И воспринимается как математическое ИЛИ :

Я сделал так, как понял задачу. Ибо каков вопрос - таков ответ! Кратные двум И трём, а не "двум, либо трём"!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 12 июня 2012, 11:14 [#7]:

Ладно, Толяныч, вот вариант "ИЛИ". Не люблю незаконченных дел...
{ Написать программу, которая генерирует все k-значные числа, не содержащие
  одинаковых цифр, кратные 2 и 3 (k<=10).}
 
program p6186;
 
{$APPTYPE CONSOLE}
 
const
  k = 3;  // задал костантой, вводить с клавы влом :)
          // при k = 8 прога отрабатывает за ~4 секунды (Intel Core2Duo, 2,7 ГГц)
          // при k = 10 ждать терпения не хватило, думаю, минуты 3-4 надо.
 
var
  Value, Limit, Temp: Int64;
  Digit, Exponent: Byte;
  Digits: set of 0..9;
 
begin
  Value:= 1;
  for Exponent:= 1 to k - 1 do
    Value:= Value * 10;               // 100 при k = 3
 
  Limit:= Value * 10;                 // 1000 при k = 3
 
  // перебираю все числа, кратные 2 или 3
  // и выбираю те, в которых цифры не повторяются
  while Value < Limit do
    begin
      if (Value mod 2 = 0) or (Value mod 3 = 0)
        then begin
               Digits:= [];
               Temp:= Value;
 
               repeat
                 Digit:= Temp mod 10; // беру цифру
 
                 if Digit in Digits   // проверка цифры на уникальность
                   then Break
                   else Include(Digits, Digit);
 
                 Temp:= Temp div 10;  // перехожу к след. цифре
               until Temp = 0;
 
               if Temp = 0
                 then WriteLn(Value);
             end; // if
 
      Inc(Value);
    end;
 
  ReadLn;   
end.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Толяныч

Толяныч (статус: 4-ый класс), 12 июня 2012, 12:24 [#8]:

Ну це зовсiм друге дiло ! Мне то до фонаря, лишь бы топикстарершу удовлетворил ( ответ, разумеется ) .
min@y™

min@y™ (статус: Доктор наук), 12 июня 2012, 12:39 [#9]:

Цитата (Толяныч):


Ты че расслабился - задачки форумские решаешь? Работать надо, повышать пр.тр. !


Да выходной, бле@ть, будь оно неладно!
Поздравляю с победой над Шведами!
Жду сёдня наших. Как бы не облажались с поляками... :)
Будешь посмотреть?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

26 июня 2012, 12:46: Статус вопроса изменён на решённый (изменил модератор DNK)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 12:00
Выполнено за 0.03 сек.