Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.22;
Скачать: CL | DM;

Вниз

Вычленить все цифры в числе   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.03 c
2-1159731938
-Dema-
2006-10-01 23:45
2006.10.22
Проблема сдобавлением даты.


2-1160033184
Fostr
2006-10-05 11:26
2006.10.22
CheckBox


2-1159561003
minza_a
2006-09-30 00:16
2006.10.22
Ошибка : Undeclared identifier: vararrayof


2-1159520154
Василий Блаженный
2006-09-29 12:55
2006.10.22
BDS2006 vs Delphi 7


8-1143041903
Pavia
2006-03-22 18:38
2006.10.22
TV tuner