javascript - 构建 n 进制数字数组的通用公式

标签 javascript arrays math numbers

假设我想构建一个以 8 或 26 为基数的数字数组,我不知道如何使用通用公式来执行此操作:

console.log(arrayOfNumbersOfBase(8, 0, 10));
console.log(arrayOfNumbersOfBase(26, 0, 10));

function arrayOfNumbersOfBase(base, start, size)
{
    var array = [];
  
    for (var i = start, n = size; i < n; i++)
    {
        array.push(i * (base));
    }

    return array;
}

最佳答案

您可以将下一个方法作为起点,基本上我必须定义一些实用方法:

  • mapToChar(n) 将数字 n 映射到字符表示形式,例如,10 映射到“A”。

    <
  • convertToBaseN(n, base) 将数字 n 转换为其在给定 base 上的表示形式。此方法使用递归方法并利用前一个方法。

  • 最后,generateNumbersOfBase(base, start, size) 生成一个由 size 元素组成的数组,以数字 start 开始给定base

代码:

// Next utility method map a decimal number to a character representation.

const mapToChar = (n) =>
{
    n = (n >= 0 && n <= 9) ? '0'.charCodeAt() + n : n - 10 + 'A'.charCodeAt();
    return String.fromCharCode(n);
}

// Next utility method convert a decimal number to his base-n representation.

const convertToBaseN = (n, base, res = "") =>
{
    if (n <= 0)
       return (res && res.split("").reverse().join("")) || "0";

    // Convert input number to given base by repeatedly 
    // dividing it by base and taking remainder.

    res += mapToChar(n % base);
    return convertToBaseN(Math.floor(n / base), base, res);
}

// Next method generates an array of numbers for a given base.

const generateNumbersOfBase = (base, start, size) =>
{
    return Array(size).fill(0).map((x, idx) => convertToBaseN(start + idx, base));
}

// Finally, generate some arrays.

let base10Array = generateNumbersOfBase(10, 15, 5);
let base2Array = generateNumbersOfBase(2, 5, 9);
let base16Array = generateNumbersOfBase(16, 10, 12);
let base8Array = generateNumbersOfBase(8, 1, 12);

console.log(
    JSON.stringify(base10Array),
    JSON.stringify(base2Array),
    JSON.stringify(base16Array),
    JSON.stringify(base8Array),
);

现在,如果您需要将某些 base-n 表示形式转换回十进制数,您可以使用下一种方法:

const convertToDec = (str, base) =>
{
    let codeA = 'A'.charCodeAt();
    let code0 = '0'.charCodeAt();

    return str.split("").reverse().reduce((acc, c, idx) =>
    {
        let code = c.charCodeAt();
        c = code + ((c >= '0' && c <= '9') ? -code0 : -codeA + 10);
        return acc += c * Math.pow(base, idx);
    }, 0);
}

// Lets convert back some arrays generated on the previous exampel

let base2Array = ["101","110","111","1000","1001","1010","1011","1100","1101"];
let base16Array = ["A","B","C","D","E","F","10","11","12","13","14","15"];

let res2 = base2Array.map(x => convertToDec(x, 2));
let res16 = base16Array.map(x => convertToDec(x, 16));

console.log(
    JSON.stringify(res2),
    JSON.stringify(res16)
);

关于javascript - 构建 n 进制数字数组的通用公式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54205990/

相关文章:

javascript - ReactJs + Reflux//触发在null组件上执行?

c++ - 在数组中间添加新索引

具有超过 4gb 元素的 Java 数组

algorithm - 确定两条线段是否相交?

javascript - 如何将大量文本发送到可编辑的 ="true"元素中?

javascript - 将每个博客日期移动到摘录的底部

javascript - Bootstrap 多选下拉列表从 optgroup 中取消选择相同值的选项

c - 如何将嵌套结构体数组作为参数传递给函数?

java - 用 Java 构建数学游戏

java - 阶乘法效果不佳!