2015-03-20 2 views
2

Можно ли сдвинуть вправо цифры целого числа? Я имею в виду смещение фактических цифр целочисленных значений, а не битов его двоичного представления - например, смещение справа на номер 435 в два раза приведет к 4. Я хочу знать, есть ли способ заменить элементарный метод деления числа на 10 количество раз, равное количеству цифр, которые вы хотите удалить.Смещение цифр в C

Благодаря

+2

Сталкивались ли вы какие-либо проблемы с 'зачаточной method'? –

+6

Разделение с базой системы цифр (в этом случае 10). Это способ сделать это. Смещение фактических бит вокруг - это та же операция, что и деление/умножение на два (основание двоичной системы). Эти две операции в основном одинаковы. Это не означает, что вы не можете придумать какое-то другое решение, но я сомневаюсь, что есть более простой метод. – adam10603

+0

'int rshift_digit (int value, int shift) {возвращаемое значение/(сдвиг 10 *); } ' –

ответ

2

Если вы думаете, что рудиментарный метод слишком медленно, вы можете использовать возведение в степень по квадратуре алгоритма для вычисления делителя: http://en.wikipedia.org/wiki/Exponentiation_by_squaring

Или вы можете использовать таблицу поиска:

int divisors_i[] = {1, 10, 100, 1000, 10*1000, ...} 

unsigned long long divisors_ull[] = {1ULL, 10ULL, 100ULL, 1000ULL, 10ULL*1000ULL, 
            100ULL*1000ULL, 1000ULL*1000ULL, 
            10ULL*1000ULL*1000ULL, 100ULL*1000ULL*1000ULL, ...} 

Обязательно выберите соответствующий тип данных для таблицы поиска. Если у вас есть int, используйте таблицу поиска int. Если у вас огромное количество, длинный длинный знак без знака может быть лучшим типом для использования.

Самый быстрый способ - использовать таблицу поиска. Он достаточно мал, чтобы вписаться в L1-кеш любого процессора, поэтому он быстрее, чем возведение в степень, возведение в квадрат.

+0

это будет смена ** левый **. OP необходимо разделить на множитель [n] – DrKoch

+0

О, вы правы. Я изменил «множители» на «делители». Теперь он имеет правильное имя. – juhist

+0

@juhist: Используйте long long вместо int. И вы можете иметь только до 10 чисел (от 1 до 10^9). После этого это вызовет переполнение. – coderredoc

3

Если вы ищете скорость, то я бы полагаться на оптимизацию компилятора с помощью следующего кода:

unsigned long long rshift(unsigned long long x, unsigned n) { 
    switch(n){ 
    case 0: return(x); 
    case 1: return(x/10); 
    case 2: return(x/100); 
    ... 
    case 19: return(x/10000000000000000000ULL); 
    default: if (x<10000000000000000000ULL) return(0); 
      printf("Sorry, not yet implemented\n"); 
      return(0); 
    } 
} 
+0

Интересный подход. Интересно, это быстрее, чем мой подход. Конечно, если вы сделаете его «статическим встроенным», а значение сдвига будет постоянным, то это, вероятно, быстрее. – juhist

+0

@Marian Как 'long long' всего лишь _at наименьшее 64-битное, полное решение должно учитывать фактическую длину' long long' компилятора. – chux

+0

Почему все ответчики на этом посту настаивают на том, чтобы повредить их предыдущую поддержку отрицательных чисел? – Bathsheba

Смежные вопросы