美文网首页
仿写一个任意进制转任意进制方法

仿写一个任意进制转任意进制方法

作者: 名侦探柯妍 | 来源:发表于2020-11-04 16:18 被阅读0次

本帖仅为日常算法练习总结,若有更好的算法欢迎留言分享。

1、先看下js原生方法

function main(num,m,n){
  const s = num+'';
  return parseInt(s,m).toString(n); // parseInt将任意进制转为10进制,再用toString转为任意进制
}

2、先准备一个工具方法将16、36等进制中的字母转成对应值,或将值转换为对应字母。

function getLetterAndAsciiValue(current) {
  // 进制的值对应的字母
  if (/\d/.test(current)) {
    if (Number(current) < 10) return String(current);
    return String.fromCharCode((Number(current) + 55));
  }
  // 进制的字母对应的值
  return String(current.toUpperCase().charCodeAt() - 55);
}

3、写一个方法将任意进制转成10进制

function fromAnyToTen(number, m) {
  const numStr = String(number);
  let sor = 0;
  Object.keys(numStr).forEach(key => {
    sor += Number(getLetterAndAsciiValue(numStr[key])) * Math.pow(m, numStr.length - key - 1);
  });
  return sor;
}

测试一下

console.log(fromAnyToTen(101111, 2), 'from any to ten');
console.log(parseInt(101111, 2), 'by js');
image.png

ok 没问题。。。

4、写一个方法将10进制转换成任意进制

这里我用了递归的方式计算(思路跟数学中的算法一样)

function fromTenToAny(numStr, n) {
  const number = Number(numStr);
  const content = Math.floor(number / n) >= n ? fromTenToAny(Math.floor(number / n), n) : '' + getLetterAndAsciiValue(Math.floor(number / n));
  return content + getLetterAndAsciiValue(number % n);
}

测试一下 2进制和36进制

console.log(fromTenToAny(47, 2), 'from ten to any');
console.log((47).toString(2), 'by js');
console.log(fromTenToAny(78999, 36), 'from ten to any');
console.log((78999).toString(36), 'by js');
image.png

ok 没问题 我们整合一下方法。

5、整合一个从任意进制转换成任意进制的方法

function parseMToN(num, m, n) {
  if (m === n) return num;
  // m为当前进制,转为n进制

  function fromAnyToTen(number) {
    const numStr = String(number);
    let sor = 0;
    Object.keys(numStr).forEach(key => {
      sor += Number(getLetterAndAsciiValue(numStr[key])) * Math.pow(m, numStr.length - key - 1);
    });
    return sor;
  }

  function fromTenToAny(numStr) {
    const number = Number(numStr);
    const content = Math.floor(number / n) >= n ? fromTenToAny(Math.floor(number / n)) : getLetterAndAsciiValue(Math.floor(number / n));
    return content + getLetterAndAsciiValue(number % n);
  }
  // 转为10进制
  if (Number(n) === 10) return fromAnyToTen(num);
  // 10进制转其他进制
  if (Number(m) === 10) return fromTenToAny(num);
  // 非10进制转非10进制
  return fromTenToAny(fromAnyToTen(num));
}

测试一下

console.log(parseMToN('l2', 36, 2));
console.log(main('l2', 36, 2));

console.log(parseMToN('89B', 16, 36));
console.log(main('89B', 16, 36));
image.png

相关文章

  • 仿写一个任意进制转任意进制方法

    本帖仅为日常算法练习总结,若有更好的算法欢迎留言分享。 1、先看下js原生方法 2、先准备一个工具方法将16、36...

  • python 进制转换

    如何表示二进制 任意进制之间的转换 任意进制转换成二进制--bin 任意进制转换成十进制--int 3.任意进制转...

  • 数字逻辑之数制转换

    一.数制转换 1.按权展开式求任意进制 2.任意进制转十位数 2.1 二进制转十进制 逐位加...

  • 任意十进制转任意进制

    输入一个十进制数N,将它转换成R进制数输出。

  • java 基础(一)

    1、进制图解 2、进制表示 3、任意进制到十进制转换 4、十进制到任意进制 5、8421快速转换法 6、原码、反码...

  • 进制间的转换

    任意进制转到10进制 系数乘以基数的权次幂相加的和 10进制转到任意进制 涉及数学公式 除基: c = a...

  • 任意进制互转

    public class NumericConvertUtils { }

  • 任意进制转换

    输入数字n和相应的进制,输出n对应的k进制数

  • 任意进制转换

    ​- 课程大类AGENDA -01 Scratch 初中高01 女性编程日周二02 Python 编程思维02 数...

  • Interger 转换为二进制

    Interger 对象有 # to_s(base) 方法可以将十进制的数字转换为任意进制的字符串 1000.to...

网友评论

      本文标题:仿写一个任意进制转任意进制方法

      本文链接:https://www.haomeiwen.com/subject/vlygvktx.html