10 進数を非 10 進数形式 (任意、ユーザー入力によって指定) に変換して出力する方法についてのアイデアが必要です。制限は、配列と文字列が許可されていないことです。そのための再帰関数を作成しましたが、同じことに対して非再帰メソッドを考えています。
重要な/深刻なものよりも、個人的な挑戦/エクササイズのほうが多いので、どこに自分を突き刺すかを気軽に教えてください.
注: この演習では C を使用しています。
10 進数を非 10 進数形式 (任意、ユーザー入力によって指定) に変換して出力する方法についてのアイデアが必要です。制限は、配列と文字列が許可されていないことです。そのための再帰関数を作成しましたが、同じことに対して非再帰メソッドを考えています。
重要な/深刻なものよりも、個人的な挑戦/エクササイズのほうが多いので、どこに自分を突き刺すかを気軽に教えてください.
注: この演習では C を使用しています。
x
基数の数値は次B
のように表される ことを思い出してください: x = a n B n + ... + a 2 B 2 + a 1 B + a 0、ここで0≤a i <B . x
でB
割ると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.
bn
base ** math.floor(math.log(x) / math.log(base))
として、または次のようにして計算できます。
var bn = 1
while bn * base < x
bn = bn * base