Другие языки программирования и технологии
Чуть -чуть доделать прогу, все сделал, конец не получается.
так звучит сама задача. Натуральное число называется двояким, если в его десятичной записи встречается не более двух различных цифр. Например, числа 3, 23, 33, 100, 12121 — двоякие, а числа 123 и 9980 — нет. Для заданного натурального числа N требуется найти ближайшее к нему двоякое число (если таких чисел два — любое из них). Формат входных данных Во входном файле записано одно натуральное число N, не превосходящее 30 000. Формат выходных данных В выходной файл требуется выдать единственное число — ближайшее двоякое к числу N. Примеры 123-122 2012-2020 11111-11111 вот в принципе то, что я ниписал. остался 1 алгоритм, который придумать не могу. var n,s,b,c,L,i,x : integer; a:array[1..10] of integer; begin readln(n); b:=n; I:=1; l:=1; while (b div 10) <> 0 do begin c := b mod 10; b := b div 10; a:=c; inc(i); inc(l); end; a:=B; for I:=L DOWNTO 1 do { вот тут должен быть алгоритм который я некак не могу сделать } for I:=L DOWNTO 1 do write(a); writeln; end. Заранее спасибо.
Вот правильная программа:
function Dvoj(N : Word) : Boolean; { функция проверки двоякости числа }
var
S : array [0..9] of Byte; P, K : Byte;
begin
for P := 0 to 9 do S[P] := 0;
while N > 0 do begin Inc(S[N mod 10]); N := N div 10; end;
K := 0; for P := 0 to 9 do if S[P] > 0 then Inc(K);
Dvoj := K < 3;
end;
function NextDvoj(N : Word; D : Shortint) : Word; { функция возвращает двоякое число или 0 }
begin
while N > 0 do
begin
if Dvoj(N) then
begin
NextDvoj := N;
Exit;
end;
N := N + D;
end;
NextDvoj := 0;
end;
var
N, L, R : Word;
begin { собственно сама программа }
Write('Введите N = '); ReadLn(N);
L := NextDvoj(N, -1); { ищем двоякое число слева }
R := NextDvoj(N, +1); { ищем двоякое число справа }
if L > 0 then { левое число может быть 0 }
begin
if (N - L = R - N) and (L <> R) then WriteLn(N, ' - ', L, ', ', R)
else if N - L < R - N then WriteLn(N, ' - ', L)
else WriteLn(N, ' - ', R);
end
else WriteLn(N, ' - ', R);
end.
Только самостоятельно переделай на чтение/запись файлов,
т. к. я сделал ввод/вывод с консоли.
function Dvoj(N : Word) : Boolean; { функция проверки двоякости числа }
var
S : array [0..9] of Byte; P, K : Byte;
begin
for P := 0 to 9 do S[P] := 0;
while N > 0 do begin Inc(S[N mod 10]); N := N div 10; end;
K := 0; for P := 0 to 9 do if S[P] > 0 then Inc(K);
Dvoj := K < 3;
end;
function NextDvoj(N : Word; D : Shortint) : Word; { функция возвращает двоякое число или 0 }
begin
while N > 0 do
begin
if Dvoj(N) then
begin
NextDvoj := N;
Exit;
end;
N := N + D;
end;
NextDvoj := 0;
end;
var
N, L, R : Word;
begin { собственно сама программа }
Write('Введите N = '); ReadLn(N);
L := NextDvoj(N, -1); { ищем двоякое число слева }
R := NextDvoj(N, +1); { ищем двоякое число справа }
if L > 0 then { левое число может быть 0 }
begin
if (N - L = R - N) and (L <> R) then WriteLn(N, ' - ', L, ', ', R)
else if N - L < R - N then WriteLn(N, ' - ', L)
else WriteLn(N, ' - ', R);
end
else WriteLn(N, ' - ', R);
end.
Только самостоятельно переделай на чтение/запись файлов,
т. к. я сделал ввод/вывод с консоли.
procedure oh_blin;
var
var
Я не понял, что ты сделал в своем коде, видимо, считал число цифр или что-то подобное, но скорее всего это неважно.
Я вижу весь алгоритм таким:
0) заводим две переменные - d1 и d2, они будут хранить 2 цифры нужного нам числа. d1 хранит первую цифру, а d2 - некое значение "неопределенно"
1) идем по числу, циклом по каждой цифре, начиная со второй
2) если цифра равна d1 то пропускаем. Если равна d2 - тоже пропускаем. Если в d2 есть значение то прерываем цикл, иначе заносим ее в d2
3)Делим число по цифрам на две части - старшую (цифры числа по которым мы прошли) и младшую (по которым не прошли) .
Таким образом - старшая часть числа - "двоякая", а младшая содержит лишние цифры, и даже начинается с лишней цифры и вообще, должна быть изменена.
4) если d1 > d2 меняем их местами.
5)Итак, нам нужно заменить вторую часть числа таким образом, чтоб она состояла только из цифр d1 и d2 (d1 < d2 ),
Пусть первая цифра этой второй части = d, d не равен d1 и d2
Если d < d1 то заполняем все цифры второй части символами d1 .
Если d > d2 то забиваем, соответственно, d2
Если d1 < d < d2 то ищем ближайшее ко второй части число из [d1, d2, d2, ..] и [d2, d1, d1...]
Возможные вопросы и ответы на них:
1) Почему сначала проверяются первые цифры? - Потому что при изменении старших разрядов, число будет сильнее отличаться, чем если менять младшие разряды.
2) Почему если d < d1 то заполняем число цифрами d1? - Потому что мы составляем число из символов d1 и d2, и число [d1 d1 d1 ...] наименьшее.
3) Что за число [d1, d2, d2, ..] ? Это число, на первом месте которого стоит цифра d1 а на остальных d2. Длина его равна той второй части числа.
4) а почему если d1 < d < d2 то собираем такие странные числа? Потому что [d1, d2, d2, ..] - наибольшее из чисел, которое меньше входного, а [d2, d1, d1...] - наименьшее из тех что больше.
5) Какой же результат? Результат работы - число, состоящее из двух частей - первая часть - по ней бежали циклом, вторая - состоит из d1 и d2, причем длина второй части должна быть равна части числа, по которой не пробежали циклом.
6) Сделай за меня пожалуйста? Нет, сам сделай.
Я вижу весь алгоритм таким:
0) заводим две переменные - d1 и d2, они будут хранить 2 цифры нужного нам числа. d1 хранит первую цифру, а d2 - некое значение "неопределенно"
1) идем по числу, циклом по каждой цифре, начиная со второй
2) если цифра равна d1 то пропускаем. Если равна d2 - тоже пропускаем. Если в d2 есть значение то прерываем цикл, иначе заносим ее в d2
3)Делим число по цифрам на две части - старшую (цифры числа по которым мы прошли) и младшую (по которым не прошли) .
Таким образом - старшая часть числа - "двоякая", а младшая содержит лишние цифры, и даже начинается с лишней цифры и вообще, должна быть изменена.
4) если d1 > d2 меняем их местами.
5)Итак, нам нужно заменить вторую часть числа таким образом, чтоб она состояла только из цифр d1 и d2 (d1 < d2 ),
Пусть первая цифра этой второй части = d, d не равен d1 и d2
Если d < d1 то заполняем все цифры второй части символами d1 .
Если d > d2 то забиваем, соответственно, d2
Если d1 < d < d2 то ищем ближайшее ко второй части число из [d1, d2, d2, ..] и [d2, d1, d1...]
Возможные вопросы и ответы на них:
1) Почему сначала проверяются первые цифры? - Потому что при изменении старших разрядов, число будет сильнее отличаться, чем если менять младшие разряды.
2) Почему если d < d1 то заполняем число цифрами d1? - Потому что мы составляем число из символов d1 и d2, и число [d1 d1 d1 ...] наименьшее.
3) Что за число [d1, d2, d2, ..] ? Это число, на первом месте которого стоит цифра d1 а на остальных d2. Длина его равна той второй части числа.
4) а почему если d1 < d < d2 то собираем такие странные числа? Потому что [d1, d2, d2, ..] - наибольшее из чисел, которое меньше входного, а [d2, d1, d1...] - наименьшее из тех что больше.
5) Какой же результат? Результат работы - число, состоящее из двух частей - первая часть - по ней бежали циклом, вторая - состоит из d1 и d2, причем длина второй части должна быть равна части числа, по которой не пробежали циклом.
6) Сделай за меня пожалуйста? Нет, сам сделай.
сорри
Похожие вопросы
- срочно помогите пожалуйста доделать прогу в delphi!!! дана символьная матрица. подсчитать количество различных элементов
- помогите доделать прогу на с++ пожалуйста
- какой прогой можно сделать просмотр фото с произведением музыки ?
- Какой прогой можно сделать верстку книги на русском языке?
- Можно ли сделать чтобы прога включала левую клавишу мышки?
- при установке русской проги на немецкой Windows XP всё пишется иероглифами какими то. что можно сделать подскажите.
- народ помогите пожалуйста) надо сделать прогу на pascal)
- Можете помочь дополнить код в ассемблере. Что-то не получается до конца сделать.
- Я внутри написал, что я знаю про паскаль не то что решать и все такое а так теоретический в общем, смысл проги, я прав?
- Помогите пожайлуста доделать программу в паскале! Не получается ((