2010-05-28 6 views
-6

Можно создать дубликат:
Efficient algorithm for conversion between numeral systemалгоритма для преобразования числа в неизвестном основании с эквивалентного основанием 10 числа

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

+1

Должно ли это быть помечено домашним заданием? –

+3

Как это возможно? Какая база «4»? Это может быть база 5, база 12, база 123 - теперь у вас есть возможность узнать! –

+2

Может быть, он должен прочитать: конвертировать число в базе 10 в число в любой другой базе? –

ответ

11

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

1

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

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

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

8

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

Значит, вы в основном просите функцию 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 

e.g. преобразования (355,8)

  • Первый цикл: всего = 0 + 5 * 8 * 0 = 5
  • второй контур: всего = 5 + 5 * 8^1 = 45
  • третий контур: общее утверждение = 45 + 3 * 8^2 = 237

Результат = 237

-1

проблема утверждает, что основа данного числа неизвестна. Таким образом, для продолжения необходимо принять основание для числа. Практически безопасно предположить, что цифра с максимальным значением в номере обозначает максимум, который может быть учтен в неизвестной базе. Это число, например, если указано, как, 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)"); 

Надежда это помогает.

0

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

общественности INT convertToBase (интермедиат inNumber, внутр InBASE, внутр outBase) {

// бла-бла

возвращение convertedNumber; }

0

общественного класса 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; 

} 

}

2

Вы можете просто использовать алгоритм 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)]