Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1160297204
WoW
2006-10-08 12:46
2006.10.22
Нужен толковой пример по работе с интерфейсами...


2-1160115430
Priest
2006-10-06 10:17
2006.10.22
Как найти ошибку если есть только адрес


2-1160205479
NikIta88
2006-10-07 11:17
2006.10.22
Странное поведение OpenDialog


3-1156145027
Mishenka
2006-08-21 11:23
2006.10.22
Как запросу динамически добавить вычисляемое поле?


1-1158148481
DelphiLexx
2006-09-13 15:54
2006.10.22
Не открывается помощь





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский