9

10 進数を混合基数表記に変換するにはどうすればよいですか?

各基数の配列と 10 進数を入力すると、各列の値の配列を出力する必要があると思います。

4

5 に答える 5

7

擬似コード:

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)
于 2009-04-17T07:05:51.233 に答える
3

番号 -> セット:

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]

そしてその逆:

32(52)、5(7)、7(24)、45(60)、15(60)、500(1000) のような数値があり、これを 10 進数に変換する場合:

数 n を取り、n-1 の因数で乗算し、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]

そして、あなたは番号を持っています。

于 2009-04-17T07:06:20.920 に答える
2

あなたJavaができること

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;
        }

//e.g. 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

反転

 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;
        }
于 2018-08-13T16:52:14.517 に答える
1

私は少し異なる方法を思いつきました、そしておそらくここの他のものほど良い方法ではありません、しかし私はとにかく共有したいと思いました:

    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

于 2009-04-17T08:07:54.330 に答える