0

10 進数を非 10 進数形式 (任意、ユーザー入力によって指定) に変換して出力する方法についてのアイデアが必要です。制限は、配列と文字列が許可されていないことです。そのための再帰関数を作成しましたが、同じことに対して非再帰メソッドを考えています。

重要な/深刻なものよりも、個人的な挑戦/エクササイズのほうが多いので、どこに自分を突き刺すかを気軽に教えてください.

注: この演習では C を使用しています。

4

1 に答える 1

0

x基数の数値は次Bのように表される ことを思い出してください: x = a n B n + ... + a 2 B 2 + a 1 B + a 0、ここで0≤a i <B . xB割るとa n B n-1 + ... + a 2 Bになることに注意してください。+ a 1と余り a 0 / B . つまり、x mod B = a 0 ( modは、除算後の剰余である係数の略です)。

アルゴリズムとして実装:

var x    = POSITIVE_INTEGER
var base = POSITIVE_INTEGER2
while x > 0
    print(x mod base)
    x = x div base    // Where "div" is integer division, equivalent to math.floor(x/base)
                      // This way we are discarding a_0.
                      // Next iteration we will get a_1, then a_2, etc.

これにより、数字が逆順に印刷されます。

回避策: 最下位桁を取得するように変調する代わりに、最上位桁を取得するように変調します。これを行うには、x - (x mod B n ) = a nに注意します。ここnで、 は最上位桁です。

var x    = POSITIVE_INTEGER
var base = POSITIVE_INTEGER2
var bn   // This is base**n, where `n` is the most significant digit.
while x > 0
    print(x - x mod bn) // Print out a_n
    x = x mod bn        // Discard a_n
    bn = bn / base      // Next iteration get a_(n-1), then a_(n-2), etc.

bnbase ** math.floor(math.log(x) / math.log(base))として、または次のようにして計算できます。

var bn = 1
while bn * base < x
    bn = bn * base
于 2013-11-17T21:23:24.107 に答える