Convert decimal fractional part to mixed (base) number

How do you convert decimal to mixed radix notation?

I assume that to enter an array of each of the bases and a decimal number, it should output an array of values ​​for each column.

+6
math
source share
5 answers

pseudo code:

bases = [24, 60, 60] input = 86462 #One day, 1 minute, 2 seconds output = [] for base in reverse(bases) output.prepend(input mod base) input = input div base #div is integer division (round down) 
+6
source share

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 vice versa:

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

Take the number n, multiply it by the factor n-1, continue with 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 a number.

+3
source share

I came up with a slightly different one, and maybe not as good a method as the others, but I decided that I would share it anyway:

  var theNumber = 313732097; // ms smhd 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 

+1
source share

In Java you could do

 public static int[] Number2MixedRadix(int[] base, int number) throws Exception { //NB if the max number you want @ a position is say 3 then the base@ tha position //in your base array should be 4 not 3 int[] RadixFigures = new int[base.length]; int[] PositionPowers = new int[base.length]; PositionPowers[base.length-1] = 1; for (int k = base.length-2,pow = 1; k >-1; k--){ pow*=base[k+1]; PositionPowers[k]=pow; }for (int k = 0; k<base.length; k++){ RadixFigures[k]=number/PositionPowers[k]; if(RadixFigures[k]>base[k])throw new Exception(" RadixFigure@ ["+k+"] => ("+RadixFigures[k]+") is > base@ ["+k+"] => ("+base[k]+") | ( number is Illegal )"); number=number%PositionPowers[k]; }return RadixFigures; } 
Example

Example

 //eg mixed-radix base for 1day int[] base = new int[]{1, 24, 60, 60};//max-day,max-hours,max-minutes,max-seconds int[] MixedRadix = Number2MixedRadix(base, 19263);//19263 seconds //this would give [0,5,21,3] => as per 0days 5hrs 21mins 3secs 

Reversal

  public static int MixedRadix2Number(int[] RadixFigures,int[] base) throws Exception { if(RadixFigures.length!=base.length)throw new Exception("RadixFigures.length must be = base.length"); int number=0; int[] PositionPowers = new int[base.length]; PositionPowers[base.length-1] = 1; for (int k = base.length-2,pow = 1; k >-1; k--){ pow*=base[k+1]; PositionPowers[k]=pow; }for (int k = 0; k<base.length; k++){ number+=(RadixFigures[k]*PositionPowers[k]); if(RadixFigures[k]>base[k])throw new Exception(" RadixFigure@ ["+k+"] => ("+RadixFigures[k]+") is > base@ ["+k+"] => ("+base[k]+") | ( number is Illegal )"); }return number; } 
+1
source share

I tried several examples earlier and found an extreme case that they did not cover. If you maximize the scale, you need to add the result from the last step.

 def intToMix(number,radix=[10]): mixNum=[] radix.reverse() for i in range(0,len(radix)): mixNum.append(number%radix[i]) number//=radix[i] mixNum.append(number) mixNum.reverse() radix.reverse() return mixNum num=60*60*24*7 radix=[7,24,60,60] tmp1=intToMix(num,radix) 
0
source share

All Articles