Преобразовать число в переменную базу в Mathematica
Пусть n будет целым числом и A = {2,3,..., 10}, и я хочу сделать следующее:
- разделите n на 2, так что есть напоминание r2 и частное q2.
- разделите q2 на 3, так что есть напоминание r3 и частное q3.
- мы повторяем это, пока частное не станет меньше следующего числа.
- напишите последний частный с предыдущими напоминаниями.
Например, 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
поскольку q4 = 1 меньше следующего числа, т. е. 5, мы ломаемся.
результат равен q4r4r3r2, где он равен 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}]
где это не мой желаемый результат.
2 ответа
Решение
Это код:
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}
Вы можете использовать что-то вроде этого:
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}