IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Игра с калькулятором, +
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 9
Пол: Мужской
Реальное имя: Илья

Репутация: -  0  +


В калькулятор вводится натурально число К и нажимается клавиша "+". Калькулятор все еще показывает К. Цель игры: получить на экране число, состоящее из одинаковых цифр. Для ее достижения можно производить только одно действие - нажимать на клавишу "=" (возможно, 0 раз). После первого нажатия получается результат К+К, после очередного нажатия результат увеличивается на К. Требуется определить, удастся ли достичь цели, а если удастся, то какое число, состоящее из одинаковых цифр, будет получено первым. Количество отображаемых калькулятором цифр считать неограниченным, время работы батареек - тоже.
Ограничения: 1<=K<=999, время 1с.
Вводится одно число - К.
Вывести если цели достичь невозможно "No", если возможно, вывести два числа через пробел: цифру, из которой состоит искомое число, и количество цифр в числе.

Пример.
ввод№1
37
вывод№1
1 3

ввод№2
25
вывод
No




Я даже не знаю, что делать. Тупой перебор не пойдет потому как числа могут быть очень большие....как мне кажется должна быть формула, но вот только какая.... wacko.gif

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

Сообщение отредактировано: Учинек -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Учинек @ 23.12.2008 16:30) *
И еще по-моему числа которые заканчиваются на 0 не будут образовывать число с одинаковыми цифрами, сколько их не складывай.
Хорошее соображение - числа, большие нуля (по условию), не могут состоять из одних нулей smile.gif. Это я, кстати, использую ниже.

Цитата(Учинек @ 23.12.2008 16:30) *
Я даже не знаю, что делать. Тупой перебор не пойдет потому как числа могут быть очень большие....как мне кажется должна быть формула, но вот только какая....
Не думаю, чтоб была какая-то полезная формула на этот счет. Как грится, "трясти надо!" (с). Это тебе кажется, что числа будут очень большие: у страха глаза велики smile.gif. Вот, смотри.

Многократное сложение есть на самом деле умножение. Исходное число не больше тысячи. После умножения его на 1000 комбинации низших трех разрядов начнут повторяться:
...
123 * 1000 = 123000
123 * 1000 + 123 = 123123
...
Поэтому достаточно рассмотреть не более чем тысячекратное сложение. А это значит, что числа будут не больше 999999. Таким образом, работаем с типом LongInt и забываем о проблеме "больших чисел" smile.gif.


Подходов я вижу два: один прямой, другой "с заднего кирильца" (с). Первый - тупо в лоб складывать числа, как написано в условии, и проверять. Вот он:
function Digit(n: LongInt; p: byte): byte;
var
i: integer;
m: LongInt;
begin
m:=1;
for i:=2 to p do m:=m*10;
Digit:=n div m mod 10
end;

var
a,k: LongInt;
i: integer;
d,j,p,n: byte;

begin
ReadLn(k);
a:=0;
for i:=1 to 999 do begin
a:=a+k;
j:=7;
repeat
Dec(j);
d:=Digit(a,j)
until d>0;
n:=j;
Dec(j);
while (j>0)and(Digit(a,j)=d) do Dec(j);
if j=0 then begin
WriteLn(d,' ',n);
exit
end
end;
WriteLn('No')
end.

Выглядит громоздко даже с функцией.. А если не уложимся во время (хотя, 1 сек - не так и мало), то придется вставить вычисление цифры прямо в код.

Второй метод основан на том, что чисел, состоящих из одинаковых цифр в диапазоне до миллиона не так уж и много (а точнее, 6*9=54). Перебираем их все и делим на данное число. Если остаток равен нулю - нам повезло smile.gif. Этот способ гораздо изящнее и заведомо укладывается в сотые доли секунды, полагаю..
Вот он:
var
a,k: LongInt;
i,j: byte;

begin
ReadLn(k);
a:=0;
for i:=1 to 6 do begin
a:=a*10+1;
for j:=1 to 9 do if a*j mod k=0 then begin
WriteLn(j,' ',i);
exit
end
end;
WriteLn('No')
end.


Вот и все.
Как грится - хорошо smile.gif, но мало.. sad.gif

Добавлено через 10 мин.
Еще, вот это понравилось:
Цитата(Учинек @ 23.12.2008 16:30) *
В калькулятор вводится натурально число К ...
Так и хочется добавить: "чисто конкретно" - и расставить пальцы.. smile.gif


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 1.06.2024 16:13
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name