| 
| 
 | Вопрос # 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™ (статус: Доктор наук), 10 июня 2012, 18:58 [#1]:Ну чо, мужики! Решите девчонке задачку! А то я уже старый, шоб такой фигнёй по выходным заниматься...
   Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Толяныч (статус: 4-ый класс), 11 июня 2012, 23:28 [#2]:А что с этими числами делать ? На экран выводить или в файл пихать ? Представляю, как комп будет матом ругаться для k=20, к примеру. С нуля могут начинаться ? Не зная броду, не тронь колоду. |  
|   | 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™ (статус: Доктор наук), 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™ (статус: Доктор наук), 12 июня 2012, 11:07 [#6]: Цитата (Толяныч): Мне кажется, что в обычном ( бытовом ) смысле И воспринимается как математическое ИЛИ : Я сделал так, как понял задачу. Ибо каков вопрос - таков ответ! Кратные двум И трём, а не "двум, либо трём"!
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | 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™ (статус: Доктор наук), 12 июня 2012, 12:39 [#9]: Цитата (Толяныч): Ты че расслабился - задачки форумские решаешь? Работать надо, повышать пр.тр.  !
 
 
 Да выходной, бле@ть, будь оно неладно!
 Поздравляю с победой над Шведами!
 Жду сёдня наших. Как бы не облажались с поляками...
  Будешь посмотреть?
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  26 июня 2012, 12:46: Статус вопроса изменён на решённый (изменил модератор DNK) Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |