Алгоритм для преобразования числа в неизвестной базе в эквивалентную базу 10 числа

Возможный дубликат:
Эффективный алгоритм для преобразования между системой счисления

Учитывая целое число, напишите программу, которая преобразует данное число в число (в базе 10). Подсказка - данное число может быть в любой базе, но база неизвестна.

7 ответов

Это не может быть сделано; без знания исходной базы число неоднозначно. 10 в базе n переводит на n в базе 10; Есть бесконечные возможности

Я предполагаю, что под "неизвестным" вы подразумеваете, что алгоритм должен быть в состоянии справиться с любой базой? В противном случае это просто невозможно.

Итак, вы в основном запрашиваете функцию convert(number, base) = base10Number?

count = 0
total = 0
for each digit in number, from least significant to most significant
  total = total + digit * base^count
  count = count + 1

например конвертировать (355,8)

  • первый цикл: всего = 0 + 5 * 8^0 = 5
  • второй цикл: всего = 5 + 5 * 8^1 = 45
  • третий цикл: всего = 45 + 3 * 8^2 = 237

Результат = 237

Вы можете просто использовать алгоритм Wallar для преобразования базы. Алгоритм изменяет n базы c на n базы b. n - список цифр, составляющих номер. Каждая цифра может содержать более одной цифры. Ниже приведена реализация алгоритма Уоллара в Python.

from math import *
def baseExpansion(n,c,b):
    j = 0
    base10 = sum([pow(c,len(n)-k-1)*n[k] for k in range(0,len(n))])
    while floor(base10/pow(b,j)) != 0: j = j+1
    return [floor(base10/pow(b,j-p)) % b for p in range(1,j+1)]

Это легко сделать, если у вас есть база.

Вы можете получить нижнюю границу для базы, найдя самую высокую цифру. Как и в числе 175234, основание должно быть не менее 8. Однако вы не можете найти верхнюю границу: число может быть любым основанием от 8 до бесконечности.

Вместо этого вы можете распечатать число, которое было бы, учитывая, что первая база была, например, 8, 9 или 10. Затем пользователь может решить, что он / она думает.

Открытый класс TestNumberBase {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub

    System.out.println(converNumberTObase(100000, 2, 16));

}

public static int converNumberTObase(int inNum, int inBase, int outBase) {

    return convertDecimalToOtherBase(convertDecimalEquivalent(inNum, inBase), outBase)  ;   

}

public static int convertDecimalEquivalent(int number, int inBase) {

    int outNumber = 0;
    int _base =inBase;


    while (number > 0) {
        int digit = number % 10;
        number = number / 10;

        outNumber = outNumber + (inBase / _base) * digit;
        inBase = inBase*_base;

    }

    return outNumber;

}
public static int convertDecimalToOtherBase(int number, int outBase) {

    int outNumber = 0;
    int _base = 10, base =10;


    while (number > 0) {
        int digit = number % outBase;
        number = number / outBase;

        outNumber = outNumber + (base / _base) * digit;
        base = base*_base;

    }

    return outNumber;

}

}

Это неправильный вопрос, потому что учтите, что число 7 может быть в восьмеричной системе, в шестнадцатеричной системе. Это невозможно решить. Мы должны знать базу входных чисел. Мы можем написать такой метод

public int convertToBase (int inNumber, int inBase, int outBase) {

// бла бла

вернуть convertNumber; }

В постановке задачи утверждается, что база данного числа неизвестна. Таким образом, чтобы продолжить, нужно принять базу для числа. Практически безопасно предположить, что цифра с максимальным значением в числе обозначает максимум, который может быть учтен в неизвестной базе. Это число, например, если указано как 254, можно предположить, что система счисления состоит из цифр 0, 1, 2, 3, 4, 5 - или основания 6.

if(!(((ascii >= '0') && (ascii <= '9')) || ((ascii >= 'A') && (ascii <= 'Z')))) {
   printf("Illegal number, can have only digits (0-9) and letters (A-Z)");

Надеюсь это поможет.

Другие вопросы по тегам