Определить местную стоимость для любой базы - PullRequest
4 голосов
/ 06 марта 2009

Я ищу функцию, которая будет определять стоимость места с учетом числа и базы. Например,

Дано:

Whole Value: 1120
Base: 10
Place: Tens place

Должен вернуться: 2

Кто-нибудь знает математику для этого?

Редактировать: Ожидается, что функция также передаст все значение численно, а не в виде строки типа "e328fa" или чего-то еще. Также возвращаемое значение также должно быть числовым, поэтому FindInPlace (60 (целое значение), 16 (базовое), 2 (место, индекс на основе 1)) должно возвращать 3.

Ответы [ 5 ]

3 голосов
/ 07 марта 2009

При индексации места на основе 1 формула:

placeval = этаж (число / (база ^ (место-1))) мод база

В Python:

def FindInPlace(number, base, place):
    return number//base**(place-1) % base
3 голосов
/ 06 марта 2009
int getPlace(float x, float place) {

    return (int)(x/place) % 10;
}

Это работает для base-10 и может обрабатывать места справа или слева от десятичной дроби. Вы бы использовали это так:

place = getPlace(1120,10);
otherPlace = getPlace(0.1120,1e-3);

Более общее решение для любой базы сложно. Я бы пошел с решением для строки.

3 голосов
/ 06 марта 2009

Если число уже преобразовано в целое число (т. Е. Основание 10)

// Supports up to base 36
char digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

char FindPlace(int number, int base, int digit)
{
   if(digit < 0) return 0;

   // Essentially divide the number by [base] to the [digit] power
   for(i=0; i<digit; i++)
   {
      number /= base;      
   }

   // TODO: Verify that the digit is in range of digits    
   return digits[number % base];
}

(0 дает вам самую правую цифру, 1 дает вам самую правую цифру и т. Д.)

Я вернул цифру как char, чтобы учесть базы больше 10.

Обратите внимание, что если вы хотите разрешить пользователю вводить нужную цифру как "1 s место, 10 s место, 100 s место" или "1 s, 16 s, 256 s ", вы просто делаете

digit = log(PlaceValue, base);

или переписать код на

char FindPlace(int number, int base, int digitAsBaseToAPower)
{
    // TODO: Error checking
    return digits[(number / digitAsBaseToAPower) % base];
}
1 голос
/ 06 марта 2009

Как то так?

int place_value(int value, int base, int place)
{
    int value_in_place= value;
    for (int place_index= 1; place_index<place; ++place_index)
    {
        value_in_place/=base;
    }

    return value_in_place % base;
}

где место - это основанный на единице индекс нужной вам цифры справа.

0 голосов
/ 06 марта 2009

Следующий метод, placeValue , возвращает char , потому что основания 11-36 имеют цифры больше 9. Метод ожидает:

  • int значение: все значение
  • int base: числовая база для преобразования целого числа в; допустимые значения 2-36
  • int место: индекс цифры; наименее значимая цифра имеет индекс 1

import java.math.BigInteger;

...

    private static char placeValue(int value, int base, int place) {
        BigInteger bigValue = BigInteger.valueOf(value);
        String baseString = bigValue.toString(base);
        int numDigits = baseString.length();
        int digitIndex = numDigits - place;
        char digit = baseString.charAt(digitIndex); 
        return digit;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...