使用分而治之的二进制到十进制转换

Binary to Decimal Conversion using Divide-and-conquer

本文关键字:十进制 转换 二进制 分而治之      更新时间:2023-10-16

我目前被困在一项作业上,几乎到处寻找我想要做什么的提示。

赋值很简单,我们要得到一个向量形式的二进制数(例如 [1,1,1,1

]),我们要计算这个数字的十进制形式并放回相同的向量形式(例如 [1,5] 作为上一个例子的答案)。

虽然起初我认为这会有一个简单的解决方案,但我很快发现我们要使用这种方法来计算非常大的数字,例如二进制中的 300 个 1。

现在,在我意识到我试图直接计算它的错误之后,我很快就找到了"分而治之"的方法思想,但我没有找到一个地方给出如何在这种情况下使用它的精确例子。

由于这是一个作业,我宁愿提出一个实际解释概念并提供示例的答案,而不是直接的代码块。

提前谢谢你,

马修

编写一个以 10 为基数的数学引擎。

它应该包括另一个以 10 为基数的加法,以及乘以 int 的乘法。 (加倍就足够了)

遍历二进制数字,跟踪与该数字对应的以 10 为基数的数字。

有条件地积累。

唯一困难的部分是基础 10 数学系统,其他一切都需要 3 到 8 行代码。

可悲的是,可以更有效地做到这一点的简单方法非常有限,因为二进制数的任何数字都可以影响等效的 10 进制数的任何数字。 可能有花哨的方法,但对于 300 位数字,您不应该打扰。

以下是您问题的解决方案:

#include <iostream>
#include <algorithm>
#include <vector>
#include <math.h>
using namespace std;
string Reverse(string input){
    string copy(input);
    reverse(copy.begin(), copy.end());
    return copy;
}

string Accumulate(vector<double> vNumbers){
    // Do some processign here to add these doubles
    return string("");
}
string Convert(string input){
    input = Reverse(input);
    int power =0;
    vector<double> vNumbers;
    for(string::iterator it=input.begin();it!=input.end();it++){
         if(*it=='1')
             vNumbers.push_back(pow(2, power));
         power++;
    }

    return Accumulate(vNumbers);
}

void main(){
 string s = "0110 0010 0010 1000 0000 1011 0110 1111 0010 0000 1101 1101 0101 0010 0011 0111 0001 0001 0010 0100 1110 0110 0010 0010 1000 0000 1011 0110 1111 0010 0000 1101 1101 0101 0010 0011 0111 0001 0001";
 cout << "input:" << s.c_str() << endl;
 cout << "Output:" << Convert(s).c_str() << endl;
}

名称不言自明。 以下是执行的步骤:

  1. 将字符串作为输入
  2. 使用 std 库函数反转字符串,因为处理从右侧开始,即数字中的单位数字。
  3. 将电源和计数器初始化为 0
  4. 将 1110 转换为十进制的公式:(1)*2*2*2 + (1)*2*2 + (1)*2 + (0)*1 = 14
  5. 逐个迭代字符串的字符;如果字符为 1,则计算 2^power 并添加到计数器。 如果为 0,则忽略
  6. 将功率增加 1
  7. 将计数器(即答案)转换为字符串
  8. 自己编写 Accumulate()。