Модераторы: Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вычленить все цифры в числе 
:(
    Опции темы
POP
Дата 4.10.2006, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 7.9.2006

Репутация: нет
Всего: 1



Есть некий алгоритм трансформации числа, напримре двухзначное число представим в виде двух цифр 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.

Для 32045  будет 10000*3 + 1000*2 + 100*10 (0 приняли за 10) + 10*4 + 5  = 33045  , а теперь нужно из 33045 получить по цифренно '3' '2'  '0' '4' '5' 
PM MAIL   Вверх
Rodman
Дата 4.10.2006, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 26
Всего: 122



К примеру у тебя цыфра вводится в эдит

Код

var numbers, res:string;
     D1:array [1..100] of integer;
    I:integer;
begin
 numbers:=edit1.text;
 for i:=1 to Length(Edit1.text) do
  begin
   if(numbers[i] in [0..9])then
     if(numbers[i]=0)then
        D1[i]:=10
      else 
        D1[i]:=StrToStr(numbers[i])
     res:=res+IntToStr(D1[i])+' разрядность посчитай  '
  end;
end;


Это сообщение отредактировал(а) Rodman - 4.10.2006, 17:14
PM MAIL WWW Skype GTalk YIM MSN   Вверх
POP
Дата 4.10.2006, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 7.9.2006

Репутация: нет
Всего: 1



Цитата(Rodman @ 4.10.2006,  17:07)
К примеру у тебя цыфра вводится в эдит

Код

var numbers, res:string;
     D1:array [1..100] of integer;
    I:integer;
begin
 numbers:=edit1.text;
 for i:=1 to Length(Edit1.text) do
  begin
   if(numbers[i] in [0..9])then
     if(numbers[i]=0)then
        D1[i]:=10
      else 
        D1[i]:=StrToStr(numbers[i])
     res:=res+IntToStr(D1[i])+' разрядность посчитай  '
  end;
end;

Ты похоже ничего не понял, во первых не String,  а Integer, вот вторых  возьмем число 90 , после преобразования получается 9*10 + 10 = 100 , переведи его при помощи твоей фунции в 90 обратно... то-то.


PM MAIL   Вверх
HellanD
Дата 4.10.2006, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 443
Регистрация: 16.5.2006
Где: Киев

Репутация: нет
Всего: 2



Извините а обязательно в Делфи просто точно знаю как такое сделать в С
там есть операция взятия остатка от деления... 


--------------------
Мой сайт на django
Japanese Innovations
PM ICQ   Вверх
POP
Дата 4.10.2006, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 7.9.2006

Репутация: нет
Всего: 1



Цитата(HellanD @ 4.10.2006,  17:50)
Извините а обязательно в Делфи просто точно знаю как такое сделать в С
там есть операция взятия остатка от деления...

В Delphi тоже есть остаток от деления, функция mod , напримре 9 mod 4 равно 1 , то есть остаток от деления.
PM MAIL   Вверх
Albinos_x
Дата 4.10.2006, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 2
Всего: 108



ничего не понятно из вопроса... например:

Цитата(POP @  4.10.2006,  16:54 Найти цитируемый пост)
 если одна из цифр равна нулю, то ее заменяем на 10

Цитата(POP @  4.10.2006,  16:54 Найти цитируемый пост)
результат для 05 будет равен 10 * 10 + 5 = 105

и вот не понятно, как это сочетается с:
Цитата(POP @  4.10.2006,  16:54 Найти цитируемый пост)
нужно из 33045 получить по цифренно '3' '2'  '0' '4' '5' 

почему на второй позиции получилось 2, а не 3 ?
если смотреть цытату выше, то почему на третьей позиции вместо 10 получился нуль?

если смотреть примен по последнему варианту с учётом, что по идее должно получиться: '3' '3'  '0' '4' '5 (из того как я понял задачу)
Код

type
  TMByte = array of Byte;


procedure WordToMByte(X:Word; var MByte:TMByte);
var i:byte;
    MByte_temp:array of Byte;
begin
SetLength(MByte_temp,0);
repeat
   i:=Length(MByte_temp);
   SetLength(MByte_temp,i+1);
   MByte_temp[i]:=X mod 10;
   X:=X div 10;
   until X=0;
SetLength(MByte,Length(MByte_temp));
for i:=0 to Length(MByte_temp)-1 do
    MByte[i]:=MByte_temp[Length(MByte_temp)-i-1];
SetLength(MByte_temp,0);
end;


это получим массив байт... если в конце нужно получить массив символов, то проще использовать Inttostr(Х)...

Это сообщение отредактировал(а) Albinos_x - 4.10.2006, 19:09


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
POP
Дата 4.10.2006, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 7.9.2006

Репутация: нет
Всего: 1



Цитата(Albinos_x @  4.10.2006,  19:06 Найти цитируемый пост)
почему на второй позиции получилось 2, а не 3 ?


Нужно сделать обратное!! преобразование.

Число трансформируется так: Например для 32045 будет  10000*3 + 1000*2 + 100*10 (0 приняли за 10) + 10*4 + 5  = 33045.

То есть на входе мы видеи 33045, наша задача преобразовать его в 32045, тк нам известна формула по которой 32045 трансформируется в 33045, понимаешь?

PM MAIL   Вверх
Albinos_x
Дата 4.10.2006, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 2
Всего: 108



т.е. нам надо
33045->32045

f j,hfnyj ye;yj&

Добавлено @ 19:30 
т.е. а обратно нужно?


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
POP
Дата 4.10.2006, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 7.9.2006

Репутация: нет
Всего: 1



Цитата(Albinos_x @  4.10.2006,  19:29 Найти цитируемый пост)
т.е. нам надо
33045->32045


Да.


Цитата(Albinos_x @  4.10.2006,  19:29 Найти цитируемый пост)
т.е. а обратно нужно?


Вот 33045 -> 32045 это и есть обратное.

А прямое никаких проблем не представляет, сам подумай что сложного сделать для 32045 такое преобразование - 10000*3 + 1000*2 + 100*10 (0 приняли за 10) + 10*4 + 5  = 33045 

PM MAIL   Вверх
Albinos_x
Дата 4.10.2006, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 2
Всего: 108



Цитата(POP @  4.10.2006,  19:39 Найти цитируемый пост)
А прямое никаких проблем не представляет

да и туда и обратно непредставляет...:
Код

// flag := True  -  32045->33045
// flag := False -  33045->32045
function WordToMByte(X:Word; flag: boolean):Integer;
var i: Integer;
    C: Integer;
begin
i:=1;
Result:=0;
repeat
   C:=X mod 10;
   X:=X div 10;
   if C=0 then
      if flag then C:=10 else C:=-10;
   Result:=C*I+Result;
   I:=I*10;
   until X=0;
end;



--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
POP
Дата 4.10.2006, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 7.9.2006

Репутация: нет
Всего: 1



Цитата(Albinos_x @ 4.10.2006,  19:52)
Цитата(POP @  4.10.2006,  19:39 Найти цитируемый пост)
А прямое никаких проблем не представляет

да и туда и обратно непредставляет...:
Код

// flag := True  -  32045->33045
// flag := False -  33045->32045
function WordToMByte(X:Word; flag: boolean):Integer;
var i: Integer;
    C: Integer;
begin
i:=1;
Result:=0;
repeat
   C:=X mod 10;
   X:=X div 10;
   if C=0 then
      if flag then C:=10 else C:=-10;
   Result:=C*I+Result;
   I:=I*10;
   until X=0;
end;

А вот теперь берем и проверяем твою функци:

Число 100 должно преобразоваться в 90, твой ф-я выдает -10
Число 110 должно преобразоваться в 00, твоя ф-я выдает 100
Число 500 должно преобразоваться в 490, твоя ф-я выдает 390

Так что не все тут так просто.
PM MAIL   Вверх
Albinos_x
Дата 4.10.2006, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 2
Всего: 108



....хм.....

Цитата(POP @  4.10.2006,  20:09 Найти цитируемый пост)
Число 100 должно преобразоваться в 90

т.е. если идут несколько нулей подряд, то заменяется только младший разряд...?
Цитата(POP @  4.10.2006,  20:09 Найти цитируемый пост)
Число 110 должно преобразоваться в 00

почему 00??? отнимается только 1 разряд во втором положении???


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
POP
Дата 4.10.2006, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 7.9.2006

Репутация: нет
Всего: 1



Цитата(Albinos_x @  4.10.2006,  20:52 Найти цитируемый пост)
т.е. если идут несколько нулей подряд, то заменяется только младший разряд...?


Я же формулу писал, сам переведи и увидишь, 90 = 10*9 + 10 = 100 , обратно в 90 твоей функцией не запаковывается

Добавлено @ 21:01 
Цитата(Albinos_x @  4.10.2006,  20:52 Найти цитируемый пост)
т.е. если идут несколько нулей подряд, то заменяется только младший разряд...?


Я же формулу писал, сам переведи и увидишь, 90 = 10*9 + 10 = 100 , обратно в 90 твоей функцией не запаковывается
PM MAIL   Вверх
Albinos_x
Дата 4.10.2006, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 2
Всего: 108



я наверно, только что догнал вопрос....
Он, наверно, В том что тебе нужен алгоритм обратного преобразования?...


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
POP
Дата 4.10.2006, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 7.9.2006

Репутация: нет
Всего: 1



Цитата(Albinos_x @ 4.10.2006,  21:06)
я наверно, только что догнал вопрос....
Он, наверно, В том что тебе нужен алгоритм обратного преобразования?...

Да!! smile)

Сам подумай в чем проблема преобразовать например 3-значное число по формуле 100*D1 + 10*D2 + D3 , причем заменяя 0 если он есть в числе на 10.

Проблема именно в обратном преобразовании.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.1710 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.