views:

509

answers:

3

How do you convert a decimal number to mixed radix notation?

I guess that given an input of an array of each of the bases, and the decimal number, it should output an array of the values of each column.

+4  A: 

Pseudocode:

bases = [24, 60, 60]
input = 86462                       #One day, 1 hour, 2 seconds
output = []

for base in reverse(bases)
    output.prepend(input mod base)
    input = input div base          #div is integer division (round down)
Artelius
+1  A: 

Number -> set:

factors = [52,7,24,60,60,1000]
value = 662321
for i in n-1..0
  res[i] = value mod factors[i]
  value = value div factors[i]

And the reverse:

If you have the number like 32(52), 5(7), 7(24), 45(60), 15(60), 500(1000) and you want this converted to decimal:

Take number n, multiply it with the factor of n-1, continue for n-1..n=0

values = [32,5,7,45,15,500]
factors = [52,7,24,60,60,1000]

res = 0;
for i in 0..n-1
  res = res * factors[i] + values[i]

And you have the number.

Gamecat
The question asks for the opposite of this.
Artelius
Yes corrected it. Not awake yet.
Gamecat
Clearly. In BOTH examples your for loops are traversing in the wrong order.
Artelius
also corrected, must have been a zombie this morning...
Gamecat
A: 

I came up with a slightly different, and probably not as good method as the other ones here, but I thought I'd share anyway:

var theNumber = 313732097; 

//             ms   s   m   h    d
var bases = [1000, 60, 60, 24, 365];
var placeValues = [];  // initialise an array
var currPlaceValue = 1;

for (var i = 0, l = bases.length; i < l; ++i) {
    placeValues.push(currPlaceValue);
    currPlaceValue *= bases[i];
}
console.log(placeValues);
// this isn't relevant for this specific problem, but might
// be useful in related problems.
var maxNumber = currPlaceValue - 1;


var output = new Array(placeValues.length);

for (var v = placeValues.length - 1; v >= 0; --v) {
    output[v] = Math.floor(theNumber / placeValues[v]);
    theNumber %= placeValues[v];
}

console.log(output);
// [97, 52, 8, 15, 3] --> 3 days, 15 hours, 8 minutes, 52 seconds, 97 milliseconds
nickf
I think you can use Math.DivRem in your second loop. output[v]=Math.DivRem(theNumber,placeValues[v],out theNumber);
Hafthor