1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
В калькулятор вводится натурально число К и нажимается клавиша "+". Калькулятор все еще показывает К. Цель игры: получить на экране число, состоящее из одинаковых цифр. Для ее достижения можно производить только одно действие - нажимать на клавишу "=" (возможно, 0 раз). После первого нажатия получается результат К+К, после очередного нажатия результат увеличивается на К. Требуется определить, удастся ли достичь цели, а если удастся, то какое число, состоящее из одинаковых цифр, будет получено первым. Количество отображаемых калькулятором цифр считать неограниченным, время работы батареек - тоже. Ограничения: 1<=K<=999, время 1с. Вводится одно число - К. Вывести если цели достичь невозможно "No", если возможно, вывести два числа через пробел: цифру, из которой состоит искомое число, и количество цифр в числе.
Пример. ввод№1 37 вывод№1 1 3
ввод№2 25 вывод No
Я даже не знаю, что делать. Тупой перебор не пойдет потому как числа могут быть очень большие....как мне кажется должна быть формула, но вот только какая....
И еще по-моему числа которые заканчиваются на 0 не будут образовывать число с одинаковыми цифрами, сколько их не складывай.
а я такой тупой что непонел примеров даже от куда взялись такие цифры можешь обеснить показать как цифры вычислялись
--------------------
Учусь первый год на программиста в колледже. Учусь на втором курсе в школе программирования при научно-исследовательском институте математики и информатики.
а тебе что нужно чтобы цифра 1 встретилась пару раз или как непонел ? то могу написать 25+25+25=75 Цифра 7 встретилась 1 раза. или 25+25+25+25= 100 Цифра 1 встретилась 1 раза.
--------------------
Учусь первый год на программиста в колледже. Учусь на втором курсе в школе программирования при научно-исследовательском институте математики и информатики.
...Цель игры: получить на экране число, состоящее из одинаковых цифр. .... Требуется определить, удастся ли достичь цели, а если удастся, то какое число, состоящее из одинаковых цифр, будет получено первым. .....
Это ответ на вопрос.
Т.е. если будет число 44, то вывести надо: 4 2.
А 25 сколько раз не складывай - не получиться число в котором будут все одинаковые цифры.
И еще по-моему числа которые заканчиваются на 0 не будут образовывать число с одинаковыми цифрами, сколько их не складывай.
Хорошее соображение - числа, большие нуля (по условию), не могут состоять из одних нулей . Это я, кстати, использую ниже.
Цитата(Учинек @ 23.12.2008 16:30)
Я даже не знаю, что делать. Тупой перебор не пойдет потому как числа могут быть очень большие....как мне кажется должна быть формула, но вот только какая....
Не думаю, чтоб была какая-то полезная формула на этот счет. Как грится, "трясти надо!" (с). Это тебе кажется, что числа будут очень большие: у страха глаза велики . Вот, смотри.
Многократное сложение есть на самом деле умножение. Исходное число не больше тысячи. После умножения его на 1000 комбинации низших трех разрядов начнут повторяться: ... 123 * 1000 = 123000 123 * 1000 + 123 = 123123 ... Поэтому достаточно рассмотреть не более чем тысячекратное сложение. А это значит, что числа будут не больше 999999. Таким образом, работаем с типом LongInt и забываем о проблеме "больших чисел" .
Подходов я вижу два: один прямой, другой "с заднего кирильца" (с). Первый - тупо в лоб складывать числа, как написано в условии, и проверять. Вот он:
function Digit(n: LongInt; p: byte): byte;
var
i: integer;
m: LongInt;
begin
m:=1;
for i:=2to p do m:=m*10;
Digit:=n div m mod10end;
var
a,k: LongInt;
i: integer;
d,j,p,n: byte;
begin
ReadLn(k);
a:=0;
for i:=1to999dobegin
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=0thenbegin
WriteLn(d,' ',n);
exit
endend;
WriteLn('No')
end.
Выглядит громоздко даже с функцией.. А если не уложимся во время (хотя, 1 сек - не так и мало), то придется вставить вычисление цифры прямо в код.
Второй метод основан на том, что чисел, состоящих из одинаковых цифр в диапазоне до миллиона не так уж и много (а точнее, 6*9=54). Перебираем их все и делим на данное число. Если остаток равен нулю - нам повезло . Этот способ гораздо изящнее и заведомо укладывается в сотые доли секунды, полагаю.. Вот он:
var
a,k: LongInt;
i,j: byte;
begin
ReadLn(k);
a:=0;
for i:=1to6dobegin
a:=a*10+1;
for j:=1to9doif a*j mod k=0thenbegin
WriteLn(j,' ',i);
exit
endend;
WriteLn('No')
end.
Вот и все. Как грится - хорошо , но мало..
Добавлено через 10 мин. Еще, вот это понравилось:
Цитата(Учинек @ 23.12.2008 16:30)
В калькулятор вводится натурально число К ...
Так и хочется добавить: "чисто конкретно" - и расставить пальцы..
--------------------
я - ветер, я северный холодный ветер я час расставанья, я год возвращенья домой
var
i,j,k,n,a: integer;
d: byte;
r: array[1..999]of boolean;
begin
ReadLn(k);
for d:=1to9dobeginfor j:=1to k do r[j]:=false;
a:=d;
n:=1;
repeat
r[a]:=true;
while a<k dobegin
a:=a*10+d;
Inc(n)
end;
while a>=k do a:=a-k
until (a=0) or r[a];
if a=0thenbegin
WriteLn(d,' ',n);
exit
endend;
WriteLn('No')
end.
Да, сглупил я, однако.. Но зато - оказалось, что не только хорошо, но и не очень мало!
может быть в начале поставить проверку на то если число уже с одинаковыми числами, то вывести его.
Боюсь, это не решит проблему... Дело в том, что сначала проверяются единицы (любое число единиц), потом двойки, и т.д. Поэтому число из единиц (если оно есть) находится раньше, чем из других цифр, даже если оно больше его.
Надо подумать...
Добавлено через 11 мин. Вот. Надеюсь, "это есть наш последний" (С)
var
i,j,k,m,n,a: integer;
c,d: byte;
r: array[1..999]of boolean;
begin
ReadLn(k);
c:=0;
m:=MaxInt;
for d:=1to9dobeginfor j:=1to k do r[j]:=false;
a:=d;
n:=1;
repeat
r[a]:=true;
while a<k dobegin
a:=a*10+d;
Inc(n)
end;
while a>=k do a:=a-k
until (a=0) or r[a];
if a=0thenif n<m thenbegin
c:=d;
m:=n
endend;
if c=0then WriteLn('No') else WriteLn(c,' ',m)
end.
Добавлено через 9 мин.
Цитата(Учинек @ 24.12.2008 23:22)
да задача хороша=)
Собственно, в ней ничего нет, кроме деления "уголком". Но простота тоже красива
--------------------
я - ветер, я северный холодный ветер я час расставанья, я год возвращенья домой
Ухх, тысячу лет на Паскале не писал)))) Вот еще вариант:
function solve(const k: integer): longint;
var
i, count: byte;
n, value: longint;
found: boolean;
begin
found := false;
i := 1;
whilenot (found) and ( i < 10 ) dobegin
n := 10;
value := i;
count := 1;
whilenot(found) and (n <= 1000000) dobegin
inc(count);
inc(value, i * n);
found := value mod k = 0;
ifnot found then n := n * 10;
end;
ifnot found then inc(i);
end;
if found and ( value <> k ) then writeln(i, ',', count) else writeln('no');
end;
var
k, v: longint;
begin{* for k := 1 to 999 do *}
k := 123;
solve(k);
end.
--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'