|
Вопрос # 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)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|