1

nを整数A = {2,3,...,10} とすると、次のようにします。

  1. nを 2 に割ると、リマインダr 2と商q 2があります。
  2. q 2を 3 で割ると、リマインダr 3と商q 3があります。
  3. 商が次の数より小さくなるまでこれを繰り返します。
  4. 最後の商を前のリマインダーと一緒に書きます。

たとえば、n=45

45/2 .......    r_2=1, q_2=22
22/3 .......    r_3=1, q_3=7
 7/4 .......    r_4=3, q_4=1

q 4 = 1 は次の数、つまり 5 より小さいので、ブレークします。

結果はq 4 r 4 r 3 r 2となり、1311 に等しくなります。

ご協力ありがとうございました。

私はこれをしましたが、うまくいきません

n = 45;
i = 2;
list = {Mod[n, i]};

While[Quotient[n, i] >= i + 1, n == Quotient[n, i]; i++; 
   AppendTo[list, Mod[n, i]];
   If[Quotient[n, i] < i + 1, Break[]]; AppendTo[list, Quotient[n, i]]];

list
Row[Reverse[list]]

を与える

{1, 0, 15, 1, 11, 0, 9, 3, 7, 3}
Row[{3, 7, 3, 9, 0, 11, 1, 15, 0, 1}]

それは私の望む結果ではありません。

4

2 に答える 2

1

次のようなものを使用できます。

f[n_Integer] := 
 NestWhileList[
   {QuotientRemainder[#[[1, 1]], #[[2]] + 1], #[[2]] + 1} &,
   {{n}, 1},
   #[[1, 1]] != 0 &
 ] // Rest

f[45]
{{{22, 1}, 2}, {{7, 1}, 3}, {{1, 3}, 4}, {{0, 1}, 5}}

を使用Partして、必要な出力のビットを取得できます。

構文を処理できる場合は、もう少し高度な方法を次に示します。

f2[n_Integer]    := Reap[f2[{n, 0}, 2]][[2, 1, 2 ;;]] // Reverse

f2[{q_, r_}, i_] := f2[Sow @ r; QuotientRemainder[q, i], i + 1]

f2[{0, r_}, i_]  := Sow @ r

f2[45]
{1, 3, 1, 1}
于 2012-10-24T15:16:19.637 に答える
1

これはコードです:

A = Table[i, {i, 2, 10}]; (* array of numbers *)
n = 45; (* initial value *)
ans = {}; (* future answer which is now empty list *)
For[i = 1, i <= Length[A], i++, (* looping over A *)
 If[n < A[[i]], (* exit condition *)
  ans = Append[ans, n]; (* appending last n when exit *)
  Break[]
  ];
 qr = QuotientRemainder[n, A[[i]]]; (* calculating both quotient and reminder *)
 ans = Append[ans, qr[[2]]]; (* adding second member to the answer *)
 Print[qr]; (* printing *)
 n = qr[[1]]; (* using first member as new n to process *)
 ];
ans (* printing result in Mathematica manner *)

それは与えます

{1, 1, 3, 1}
于 2012-10-26T22:56:20.300 に答える