Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 4 1 2 3 ... ПоследняяПоследняя
Показано с 1 по 10 из 40
  1. #1
    Аватар для 123
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.02.2014
    Сообщений
    93
    Репутация:
    8 ±

    Как узнать из скольких символов состоит число?

    Как проверить число на длинну? Строку можно проверить с помощью strlen(), а число только с сравнением крайних значений? Например нужно проверить на 6-ти значение число, получается, необходимо сравнить в пределах от 100000 до 999999? Или есть более рациональный подход?
    Последний раз редактировалось DeimoS; 04.10.2017 в 19:03.

  2. #2
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Условие в этом случае будет самым быстродействующим, хоть и не самым компактным вариантом :) Хотя всегда можно сделать универсальную функцию
    PHP код:
    stock GetCountsOfDigits(number)
    {
        if(
    number 100_000)
        {
            if(
    number 100)
            {
                if(
    number 10)
                    return 
    1;
                else
                    return 
    2;
            }
            else
            {
                if(
    number 1_000)
                    return 
    3;
                else
                {
                    if(
    number 10_000)
                        return 
    4;
                    else
                        return 
    5;
                }
            }
        }
        else
        {
            if(
    number 10_000_000)
            {
                if(
    number 1_000_000)
                    return 
    6;
                else
                    return 
    7;
            }
            else
            {
                if(
    number 100_000_000)
                    return 
    8;
                else
                {
                    if(
    number 1_000_000_000)
                        return 
    9;
                    else
                        return 
    10;
                }
            }
        }

    Код, если что, взят с хабра (вроде, брал отсюда) и переделан под реалии Pawn
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  3. #3
    Аватар для Bib
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.08.2017
    Адрес
    Челябинск
    Сообщений
    56
    Репутация:
    6 ±
    Можно привести число к строке и получить ее длину

    PHP код:
    new string[10];
    valstr(string123);
    printf("Длина числа: %i"strlen(string)); 

  4. #4
    Аватар для $continue$
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,487
    Репутация:
    276 ±
    ln10 - будет адекватным вариантом
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Условие в этом случае будет самым быстродействующим, хоть и не самым компактным вариантом :) Хотя всегда можно сделать универсальную функцию
    PHP код:
    stock GetCountsOfDigits(number)
    {
        if(
    number 100_000)
        {
            if(
    number 100)
            {
                if(
    number 10)
                    return 
    1;
                else
                    return 
    2;
            }
            else
            {
                if(
    number 1_000)
                    return 
    3;
                else
                {
                    if(
    number 10_000)
                        return 
    4;
                    else
                        return 
    5;
                }
            }
        }
        else
        {
            if(
    number 10_000_000)
            {
                if(
    number 1_000_000)
                    return 
    6;
                else
                    return 
    7;
            }
            else
            {
                if(
    number 100_000_000)
                    return 
    8;
                else
                {
                    if(
    number 1_000_000_000)
                        return 
    9;
                    else
                        return 
    10;
                }
            }
        }

    Код, если что, взят с хабра (вроде, брал отсюда) и переделан под реалии Pawn
    Value your freedom or you will lose it, teaches history. "Don't bother us with politics," respond those who don't want to learn. (c) Richard Stallman

  5. #5
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Будет медленнее, нежели условия. При том, в разы. Жертвовать скоростью ради компактности?
    То же самое и с переводом числа в строку (ещё медленнее будет)
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  6. #6
    Аватар для $continue$
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,487
    Репутация:
    276 ±
    2017 год. От пару мс ничего не будет
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Будет медленнее, нежели условия. При том, в разы. Жертвовать скоростью ради компактности?
    То же самое и с переводом числа в строку (ещё медленнее будет)
    Value your freedom or you will lose it, teaches history. "Don't bother us with politics," respond those who don't want to learn. (c) Richard Stallman

  7. #7
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от $continue$ Посмотреть сообщение
    2017 год. От пару мс ничего не будет
    Пару мс здесь, пару мс там и уже начинаются лаги.
    Может лучше изначально делать всё на совесть, не? Или в 2017 году появились какие-то ограничения на количество строк?
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  8. #8
    Аватар для 123
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.02.2014
    Сообщений
    93
    Репутация:
    8 ±
    Логарифм более универсальный вариант, нежели просто сравнение. Однако сравнение по скорости побеждает в 3 раза. Но сравнение с крайними значениями (то, о чем я писал в начале), самый быстрый вариант, хоть и самый узкий.

    PHP код:
    [01:54:08Режиминтерпретируемый10000x1000 итераций.
    [
    01:54:13Сравнение1214
    [01:54:13Логарифм3355
    [01:54:13Условие925 

  9. #9
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от 123 Посмотреть сообщение
    Логарифм более универсальный вариант, нежели просто сравнение
    Универсальный в чём? В том, что он может определить количество символов в числах >10 знаков? Так а в каких ситуациях такие числа вообще могут понадобиться? И где их хранить можно, если учесть, что у Integer есть своё ограничение? Сомнительная универсальность

    А сравнение с крайними значениями быстрее, скорее всего, потому, что ты просто прописал одно единственное условие, да?
    Ну типа:
    PHP код:
    if(1000000 <= number <= 9999999
    А в остальных случаях вызывал функции?
    Ибо если собрать функцию из наборов крайних значений, получится явно медленнее обычного набора условий (а без Jit ещё и медленнее логарифма может быть), ибо в наборе условий произойдёт гораздо меньше проверок, например, для числа из 10 символов (всего около 4-х проверок будет), а в случае с крайними значениями - все 10 (можно, конечно, тоже добавить дополнительные условия, но всё равно сравнение с конкретным значением будет быстрее, нежели с крайними).
    Последний раз редактировалось DeimoS; 01.10.2017 в 13:32.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  10. #10
    Аватар для $continue$
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,487
    Репутация:
    276 ±
    Иногда лучше потратить пару лишних мс, чем писать огромный код для этих же целей. На паре по алгоритмизации использовали с одногруппником данный метод. И он универсален. Не нужно писать овер999 проверок для int. На счет расширение int - есть библиотека от VVWVV - unlong. Если вдруг понадобится узнать длину, тоже будешь прописывать if/ы?

    Выбор, конечно каждого, но я бы в данном случай использовал десятичный логарифм. Решение получается компактным, логичным. В случай с if'ами оно получается далеко не компактное.

    P.S: в ней конечно есть функция ulong_getDigitCount, но вопрос остается актуальным.
    Value your freedom or you will lose it, teaches history. "Don't bother us with politics," respond those who don't want to learn. (c) Richard Stallman

 

 
Страница 1 из 4 1 2 3 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •