重複の可能性:
数値システム間の変換のための効率的なアルゴリズム
与えられた整数を (基数 10 の) 数値に変換するプログラムを作成します。ヒント - 指定された数は任意の基数である可能性がありますが、基数は不明です。
重複の可能性:
数値システム間の変換のための効率的なアルゴリズム
与えられた整数を (基数 10 の) 数値に変換するプログラムを作成します。ヒント - 指定された数は任意の基数である可能性がありますが、基数は不明です。
それはできません。ソースベースを知らなければ、その数はあいまいです。10
in base は in base に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
例: convert(355,8)
結果 = 237
n
base から basec
への単純なアルゴリズムの変更を行うことができますb
。ここで:
n
数字を構成する数字のリストです。c
初期ベースです。b
希望のベースです。各桁には複数の桁が含まれる場合があります。以下は、Python での Wallar のアルゴリズムの実装です。
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)]
以下は、3 つのメソッドを含む小さな Java の例です。
public class TestNumberBase {
public static void main(String[] args) {
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;
}
}
土台ができてしまえば簡単です。
最上位の桁を見つけることで、底の下限を取得できます。数 175234 のように、基数は少なくとも 8 でなければなりません。ただし、上限を見つけることはできません。数は 8 から無限大までの任意の基数である可能性があります。
代わりに、最初のベースがたとえば 8、9、または 10 だった場合、その数字を出力することができます。その後、ユーザーは自分の考えを決定できます。
これは間違った質問です。数 7 は 8 進法、16 進法である可能性があると考えてください。決定することはできません。入力数の基数を知る必要があります。このようにメソッドを書くことができます
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)");
お役に立てれば。