Алгоритм для преобразования числа в неизвестной базе в эквивалентную базу 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)");
Надеюсь это поможет.