Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Центр помощи > Вычленить все цифры в числе |
Автор: POP 4.10.2006, 16:54 |
Есть некий алгоритм трансформации числа, напримре двухзначное число представим в виде двух цифр 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' |
Автор: Rodman 4.10.2006, 17:07 | ||
К примеру у тебя цыфра вводится в эдит
|
Автор: POP 4.10.2006, 17:40 | ||||
Ты похоже ничего не понял, во первых не String, а Integer, вот вторых возьмем число 90 , после преобразования получается 9*10 + 10 = 100 , переведи его при помощи твоей фунции в 90 обратно... то-то. |
Автор: HellanD 4.10.2006, 17:50 |
Извините а обязательно в Делфи просто точно знаю как такое сделать в С там есть операция взятия остатка от деления... |
Автор: POP 4.10.2006, 18:04 | ||
В Delphi тоже есть остаток от деления, функция mod , напримре 9 mod 4 равно 1 , то есть остаток от деления. |
Автор: Albinos_x 4.10.2006, 19:06 | ||
ничего не понятно из вопроса... например: и вот не понятно, как это сочетается с: почему на второй позиции получилось 2, а не 3 ? если смотреть цытату выше, то почему на третьей позиции вместо 10 получился нуль? если смотреть примен по последнему варианту с учётом, что по идее должно получиться: '3' '3' '0' '4' '5 (из того как я понял задачу)
это получим массив байт... если в конце нужно получить массив символов, то проще использовать Inttostr(Х)... |
Автор: POP 4.10.2006, 19:13 |
Нужно сделать обратное!! преобразование. Число трансформируется так: Например для 32045 будет 10000*3 + 1000*2 + 100*10 (0 приняли за 10) + 10*4 + 5 = 33045. То есть на входе мы видеи 33045, наша задача преобразовать его в 32045, тк нам известна формула по которой 32045 трансформируется в 33045, понимаешь? |
Автор: Albinos_x 4.10.2006, 19:29 |
т.е. нам надо 33045->32045 f j,hfnyj ye;yj& Добавлено @ 19:30 т.е. а обратно нужно? |
Автор: POP 4.10.2006, 19:39 |
Да. Вот 33045 -> 32045 это и есть обратное. А прямое никаких проблем не представляет, сам подумай что сложного сделать для 32045 такое преобразование - 10000*3 + 1000*2 + 100*10 (0 приняли за 10) + 10*4 + 5 = 33045 |
Автор: Albinos_x 4.10.2006, 19:52 | ||
да и туда и обратно непредставляет...:
|
Автор: POP 4.10.2006, 20:09 | ||||
А вот теперь берем и проверяем твою функци: Число 100 должно преобразоваться в 90, твой ф-я выдает -10 Число 110 должно преобразоваться в 00, твоя ф-я выдает 100 Число 500 должно преобразоваться в 490, твоя ф-я выдает 390 Так что не все тут так просто. |
Автор: Albinos_x 4.10.2006, 20:52 |
....хм..... т.е. если идут несколько нулей подряд, то заменяется только младший разряд...? почему 00??? отнимается только 1 разряд во втором положении??? |
Автор: Albinos_x 4.10.2006, 21:06 |
я наверно, только что догнал вопрос.... Он, наверно, В том что тебе нужен алгоритм обратного преобразования?... |
Автор: POP 4.10.2006, 21:20 | ||
Да!! ![]() Сам подумай в чем проблема преобразовать например 3-значное число по формуле 100*D1 + 10*D2 + D3 , причем заменяя 0 если он есть в числе на 10. Проблема именно в обратном преобразовании. |
Автор: Zero 4.10.2006, 22:13 | ||
Тут всё просто:
|
Автор: Albinos_x 4.10.2006, 22:29 | ||||
попробуй это:
использование:
Добавлено @ 22:32 Zero, на 110 не верный результат выдаёт... |
Автор: Zero 4.10.2006, 22:46 | ||
Проверять вообще надо руками. Хотя, если старший разряд 10 то резултат немного не тот, но вот так всё отлично:
Добавлено @ 22:52 Стоп, извиняюсь... 100 это не верный резултат. ![]() |
Автор: Albinos_x 4.10.2006, 23:03 |
![]() ладно.. чего-то мы здесь намудрили.... при обратно преобразовании исходное число не может начинаться с нуля... следовательно можно обойтись без многоуровневых символьных проверок.... щас попробую сократить код... Добавлено @ 23:10 Попробую вернуться к первоначальному варианту.... его немного подработать... |
Автор: Albinos_x 4.10.2006, 23:25 | ||
изменил немного подход к делу... соединил 2 предложенных алгоритма мной до этого, плюс немного один переработал, с учётом, что при кодировании могут поступить значения с нулями, а при раскодировании такого не должно быть... тем самым немного сократил код:
в общем сокращение произошло только из-за того, что анализировал и изменял не символы, а цифры... |
Автор: POP 5.10.2006, 01:55 | ||||
А на самом деле обратное преобразование вот в таком маленьком коде: --- repeat c:=a mod 10; s:=inttostr©+s; if c=0 then a:=a-10; a:=a div 10; until a=0; --- Добрые люди подсказали... целый день седня копал ![]() |
Автор: Albinos_x 5.10.2006, 03:17 | ||
сравнивал с моим на обратное:
за то, моя ф-я считает и туда и обратно... |