-5

重複の可能性:
数値システム間の変換のための効率的なアルゴリズム

与えられた整数を (基数 10 の) 数値に変換するプログラムを作成します。ヒント - 指定された数は任意の基数である可能性がありますが、基数は不明です。

4

7 に答える 7

12

それはできません。ソースベースを知らなければ、その数はあいまいです。10in base は in base にn変換さn10ます。無限の可能性があります

于 2010-05-28T06:31:20.547 に答える
9

「不明」とは、アルゴリズムが任意のベースを処理できる必要があることを意味していると思いますか? そうでなければ、それは単に不可能です。

つまり、基本的に関数 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)

  • 最初のループ: 合計 = 0 + 5 * 8^0 = 5
  • 2 番目のループ: 合計 = 5 + 5 * 8^1 = 45
  • 3 番目のループ: 合計 = 45 + 3 * 8^2 = 237

結果 = 237

于 2010-05-28T06:38:34.270 に答える
2

nbase から 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)]
于 2011-11-03T02:03:07.493 に答える
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;
    }
}
于 2011-06-10T19:38:17.380 に答える
1

土台ができてしまえば簡単です。

最上位の桁を見つけることで、底の下限を取得できます。数 175234 のように、基数は少なくとも 8 でなければなりません。ただし、上限を見つけることはできません。数は 8 から無限大までの任意の基数である可能性があります。

代わりに、最初のベースがたとえば 8、9、または 10 だった場合、その数字を出力することができます。その後、ユーザーは自分の考えを決定できます。

于 2010-05-28T06:32:57.187 に答える
0

これは間違った質問です。数 7 は 8 進法、16 進法である可能性があると考えてください。決定することはできません。入力数の基数を知る必要があります。このようにメソッドを書くことができます

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

// 何とか何とか

convertNumber を返します。}

于 2011-06-10T18:44:50.677 に答える
-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)");

お役に立てれば。

于 2010-09-03T18:28:25.337 に答える