Форум: "Начинающим";
Текущий архив: 2006.10.22;
Скачать: [xml.tar.bz2];
Вниз
Вычленить все цифры в числе Найти похожие ветки
← →
POP (2006-10-04 17:32) [0]Есть некий алгоритм трансформации числа, напримре двухзначное число представим в виде двух цифр D1 и D2, например если число 05, то D1 = 0, D2 = 5
Прчем если одна из цифр равна нулю, то ее заменяем на 10 и далее считаем по формуле:
10* D1 + D2 , результат для 05 будет равен 10 * 10 + 5 = 105.
Так вот задача, как на Delphi сделать обратное преобразование, то есть из 105 сделать 05, и вывести эти две цифры 0 и 5 на экран?
Это для двухзначного, а вообще для любой значности как это сделать?
Например для 3-x значного формула будет такая 100*D1 + 10*D2 + D3 , причем если в числе есть ноль, то его заменяем на 10.
← →
umbra © (2006-10-04 17:44) [1]уточните, если есть, допустим число 32045, то какое число должно получиться после преобразования
← →
POP (2006-10-04 17:52) [2]Считаем по формуле:
10000*3 + 1000*2 + 100*10 (0 приняли за 10) + 10*4 + 5 = 33045
← →
POP (2006-10-04 17:55) [3]И после этого нужно из 33045 получить по цифренно "3" "2" "0" "4" "5"
← →
umbra © (2006-10-04 18:31) [4]ну, вот как можно сделать прямое преобразование
uses ......, Math, ....;
function Convert(number: String): String;
var
buf: Extended;
i: Integer;
digit: Byte;
begin
Result := "";
try
StrToInt(number);
except
on EConvertError do
begin
ShowMessage("Невозможно преобразовать строку в число!");
exit;
end;
end;
buf := 0;
for i := Length(number) downto 1 do
begin
digit := ord(number[i]) - 48;
if digit = 0 then
digit := 10;
buf := buf + digit*IntPower(10, length(number) - i);
end;
Result := IntToStr(trunc(buf));
end;
← →
Palladin © (2006-10-04 18:51) [5]хм, а 0905 во что должно превратиться?
в 11005 или в 1005
← →
POP (2006-10-04 18:55) [6]Ты бы ее проверил сначала, например для числа 90 после преобразования получаем 10*9 + 10 = 100 , а твоя фунция в ответ выдает 210, а не 90 , а например для числа 00, после преобразования получаем 10*10 + 10 = 110, в ответ на 110 твоя фунция выдает 110, а должна 00
← →
POP (2006-10-04 18:58) [7]
> хм, а 0905 во что должно превратиться?
>
> в 11005 или в 1005
0905 преобразуем по формуле 1000*10 + 100*9 + 10*10 + 5 = 11005
Теперь 11005 нужно преобразовать обратно в 0905 , а функция Umbra на ввод 11005 выдает ответ 12105
← →
Palladin © (2006-10-04 19:04) [8]Umbra тебе дал функцию преобразования только в одну сторону, между прочим, если ты не заметил, о чем тебе и сообщил...
← →
POP (2006-10-04 19:13) [9]
> если ты не заметил
Да, не заметил, прямое преобразование не проблема, формула то известна, а вот обратно уже намного сложнее.
← →
Palladin © (2006-10-04 19:26) [10]оно понятно... не веришь - мне даже интересно стало... вот сижу думаю...
← →
Palladin © (2006-10-04 19:27) [11]гы :) точней не думаю а пытаюсь сфокусировать мысли на задаче прохода по строке до встречного нуля и рекурсивного уменьшения значений на единицу... как нелюблю рутину и точечные удары... просто жуть...
← →
umbra © (2006-10-04 19:29) [12]боюсь, однозначно назад преобразовать нельзя, т.к., например, необратимо теряется информация о нулях в начале строки. Нули в середине и конце, в принципе, не проблема, надо лишь
if digit = 0 then
digit := 10;
заменить наif digit = 0 then
digit := -10;
← →
POP (2006-10-04 19:56) [13]
> боюсь, однозначно назад преобразовать нельзя, т.к., например,
> необратимо теряется информация о нулях в начале строки.
> Нули в середине и конце, в принципе, не проблема, надо
> лишь
>
> if digit = 0 then
> digit := 10;
>
> заменить на
> if digit = 0 then
> digit := -10;
В принипе если точно знать какой длины входящее число то это не проблема, в моем случае это 2,3 , 5 значные входящие цифры, но все равно где-то ошибка даже если отнимать 10, например для числа 100, ответ должен быть 90, а функция выдает -10
← →
POP (2006-10-04 20:56) [14]Ну что есть какие-нибудь еще варианты?
← →
default © (2006-10-04 21:00) [15]ты прям маньяк какой-то, вычленитель цифр из чисел, что тебе плохого числа-то сделали?
← →
default © (2006-10-04 21:23) [16]заметь, если в исходном числе число нулей ненулевое, то в трансформированном числе число нулей также ненулевое:)модно доказатб
так что если требуется выполнить обьратное преобразование для числа в котором нет нулей, то оно выполняется как обычно
← →
Pavia © (2006-10-04 22:02) [17]
> Ну что есть какие-нибудь еще варианты?
Такие задачки надо самому делать. причем менее чем за минуту. А ты вон уже целый день колупаешься. А ответ я уже запостил. ;-)
← →
Pavia © (2006-10-04 22:03) [18]
> POP (04.10.06 20:56) [14]
> Ну что есть какие-нибудь еще варианты?
Такие задачки надо самому делать. причем менее чем за минуту. А ты вон уже целый день колупаешься. А ответ я уже запостил. ;-)
← →
POP (2006-10-04 22:22) [19]
> Такие задачки надо самому делать. причем менее чем за минуту.
> А ты вон уже целый день колупаешься. А ответ я уже запостил.
> ;-)
такой умный :) иди ответ проверь, а заодно и свой 4 строчный код :)
← →
POP (2006-10-04 22:28) [20]Хотя нет , погоди, похоже у тебя все работает, мне показалось, что ты выложил такую же функцию как и другой участник, похоже все работает, конец моим мучениям :)
Вот функция всем на обозрение:
repeat
c:=a mod 10;
s:=inttostr(c)+s;
if c=0 then a:=a-10;
a:=a div 10;
until a=0;
:)
← →
TUser © (2006-10-05 09:38) [21]
{$apptype console}
uses SysUtils;
var s: string;
i, j, k: integer;
n: array of byte;
begin
readln (s);
i := StrToInt(s);
j := i; k:= 0;
while j > 0 do begin
inc (k); j := j div 10;
end;
SetLength (n,k); j := i;
for k := 0 to high (n) do begin
n[k] := j mod 10;
j := j div 10;
end;
for k := high (n) - 1 downto 0 do
if n[k] = 0 then begin
n[k] := 10;
dec (n[k+1]);
end;
write (i, " = ");
for k := high (n) downto 0 do begin
write (1);
for i := k - 1 downto 0 do
write (0);
write (" * ", n[k]);
if k <> 0 then
write (" + ")
else writeln;
end;
end.
← →
TUser © (2006-10-05 10:22) [22]> TUser © (05.10.06 09:38) [21]
Первый отренний опыт программирования - комом. Вот версия 2.0, надеюсь без багов :){$apptype console}
uses SysUtils;
var s: string;
i, j, k: integer;
n: array of byte;
function CountZeros: integer;
var i: integer;
begin
i := high (n);
while i >= 0 do
if n[i] <> 0 then
break
else dec (i);
SetLength (n, i + 1);
result := 0;
for i := i downto 0 do
if n[i] = 0 then
inc (result);
end;
begin
readln (s);
i := StrToInt(s);
j := i; k:= 0;
while j > 0 do begin
inc (k); j := j div 10;
end;
SetLength (n,k); j := i;
for k := 0 to high (n) do begin
n[k] := j mod 10;
j := j div 10;
end;
while CountZeros > 0 do
for k := high (n) - 1 downto 0 do
if n[k] = 0 then begin
n[k] := 10;
dec (n[k+1]);
end;
write (i, " = ");
for k := high (n) downto 0 do begin
write (1);
for i := k - 1 downto 0 do
write (0);
write (" * ", n[k]);
if k <> 0 then
write (" + ")
else writeln;
end;
end.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.10.22;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.066 c