Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Преобразование десятичного чила

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Invert
Отправлено: 01 Сентября, 2011 - 17:21:21
Post Id



Частый гость


Покинул форум
Сообщений всего: 223
Дата рег-ции: Нояб. 2010  


Помог: 5 раз(а)




Здравствуйте.
Не могли бы вы мне помочь в преобразовании десятичного числа?

Задача: Уменьшить кол-во знаков в числе используя символы для использования в строке УРЛ.
Ка пример преобразование DEC -> HEX, только в моем случае "цифр" не 16, а 62.
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. $symbols = array ( '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' );
  3.  


Для сравнения, пятизначное число имеет кол-во комбинаций:
В десятичной - 10^5 = 100.000 с нулевым значением ( от 0 до 99.999 )
В хексе - 16^5 = 1.048.576
В нашей системе - 916.132.832

Как видите преимущество на лицо, только с реализацией уже запутался.

Могли бы вы помочь мне в решении задачи или скинуть ссылку на материал, способный мне помочь?
 
 Top
Мелкий Супермодератор
Отправлено: 01 Сентября, 2011 - 19:40:08
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)






-----
PostgreSQL DBA
 
 Top
Champion Супермодератор
Отправлено: 01 Сентября, 2011 - 20:25:00
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Мелкий пишет:
base_convert

Цитата:
frombase, и tobase должны быть в диапазоне от 2 до 36 включительно.

Invert пишет:
а 62.

Это ж обычный перевод из одной с.с. в другую.
CODE (htmlphp):
скопировать код в буфер обмена
  1. $symbols = array(...);
  2. $res = '0';
  3. $num = 12345678;
  4. $base = 62;
  5. while($num > 0) {
  6. $res .= $symbols[ $num % $base  ]; // может строка получится задом. Лень думать уже :)
  7. $num /= $num; // не уверен, оставит ли тут php только целую часть. Если нет, то надо округлить.
  8. }


Ну а обратно - проще: в цикле $res = $str[0] + $str[1]*62 + $str[2]*62^2 + ... + $str[n]*62^n
 
 Top
Invert
Отправлено: 01 Сентября, 2011 - 21:02:00
Post Id



Частый гость


Покинул форум
Сообщений всего: 223
Дата рег-ции: Нояб. 2010  


Помог: 5 раз(а)




Champion пишет:
Это ж обычный перевод из одной с.с. в другую.

Спасибо, именно так. В метро сидел и все сразу стало понятно.
С утра что-то голова не могла думать, в трех строчках кода путался.
 
 Top
Invert
Отправлено: 03 Сентября, 2011 - 03:09:53
Post Id



Частый гость


Покинул форум
Сообщений всего: 223
Дата рег-ции: Нояб. 2010  


Помог: 5 раз(а)




Все, сделал.
Я еще никогда не наступал на такое кол-во граблей в настолько маленьком кусочке кода.

Протестировано на гигантских цифрах (10^15), можно использовать. Числа более 10^15 уже не обрабатываются, PHP "чихает".

Результат:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. 60 : X
  3. 61 : Y
  4. 62 : Z
  5. 63 : 00
  6. 64 : 01
  7. 65 : 02
  8. ...
  9. 3521681 : dL8i
  10. 3521682 : dL8j
  11. 3521683 : dL8k
  12. ...
  13. 3521614606208 : YYYYYYZ
  14. 3521614606209 : YYYYYZ0
  15. 3521614606210 : YYYYYZ1
  16. ...
  17. 1000000000000000 : 3yWxKD0Fv
  18. 1000000000000001 : 3yWxKD0Fw
  19. 1000000000000002 : 3yWxKD0Fx
  20.  


Код:
PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3. $symbols = array ( 1 => '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' );
  4.  
  5. $symbols_count = count ( $symbols );
  6.  
  7. for ( $i = 55; $i <= 88; $i++ ) {
  8.  
  9.    $number = $i;
  10.    $result = '';
  11.  
  12.    while ( $number > 0 ) {
  13.  
  14.       $number = $number / $symbols_count;
  15.  
  16.       $integer = ( integer ) $number;
  17.  
  18.       $fraction = $number - $integer;
  19.  
  20.       $number = $integer;
  21.  
  22.       if ( $fraction !== 0 ) {
  23.  
  24.          $code = ( string ) ( round ( $fraction * $symbols_count ) );
  25.  
  26.       } else {
  27.  
  28.          $code = ( string ) $symbols_count;
  29.  
  30.          $number--;
  31.  
  32.       }
  33.  
  34.       $result .= $symbols[  $code ];
  35.  
  36.    }
  37.  
  38.    $result = strrev ( $result );
  39.  
  40.    echo $i . ' : ' . $result . '<br>';
  41.  
  42. }
  43.  
  44.  

(Отредактировано автором: 03 Сентября, 2011 - 05:40:41)

 
 Top
Invert
Отправлено: 04 Сентября, 2011 - 04:31:41
Post Id



Частый гость


Покинул форум
Сообщений всего: 223
Дата рег-ции: Нояб. 2010  


Помог: 5 раз(а)




И в обратную сторону:

PHP:
скопировать код в буфер обмена
  1. $symbols = array (
  2. '0' =>  1, '1' =>  2, '2' =>  3, '3' =>  4, '4' =>  5, '5' =>  6, '6' =>  7, '7' =>  8, '8' =>  9, '9' => 10, 'a' => 11, 'b' => 12, 'c' => 13, 'd' => 14, 'e' => 15, 'f' => 16, 'g' => 17, 'h' => 18, 'i' => 19, 'j' => 20, 'k' => 21, 'l' => 22, 'm' => 23, 'n' => 24, 'o' => 25, 'p' => 26, 'q' => 27, 'r' => 28, 's' => 29, 't' => 30, 'u' => 31, 'v' => 32, 'w' => 33, 'x' => 34, 'y' => 35, 'z' => 36, 'A' => 37, 'B' => 38, 'C' => 39, 'D' => 40, 'E' => 41, 'F' => 42, 'G' => 43, 'H' => 44, 'I' => 45, 'J' => 46, 'K' => 47, 'L' => 48, 'M' => 49, 'N' => 50, 'O' => 51, 'P' => 52, 'Q' => 53, 'R' => 54, 'S' => 55, 'T' => 56, 'U' => 57, 'V' => 58, 'W' => 59, 'X' => 60, 'Y' => 61, 'Z' => 62 );
  3.  
  4. $string = 'aB8';
  5. $symbols_count = count ( $symbols );
  6. $symbol_array = str_split ( $string );
  7. $symbol_array = array_reverse ( $symbol_array );
  8.  
  9. foreach ( $symbol_array as $exponent => $code ) {
  10.    $number = ( int ) ( $symbols [ $code ] );
  11.    $result += $number * pow ( $symbols_count, $exponent );
  12. }
  13.  
  14. echo $result;

(Отредактировано автором: 04 Сентября, 2011 - 04:32:36)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Хранение данных, их вывод и обработка »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB