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

时间:2013-09-18 18:04:15

标签: c++ binary decimal

我目前被困在一项任务上,几乎无处可寻,甚至暗示我正在尝试做什么。

赋值很简单,我们将以向量的形式给出一个二进制数(例如[1,1,1,1],我们要计算这个数字的十进制数,然后放回到相同的矢量形式(例如[1,5]代表前一个例子的答案)。

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

现在在我意识到我试图直接计算它的错误之后,我很快找到了“分而治之”的方法想法,但我没有找到一个地方给出了一个如何在这个中使用它的精确示例上下文。

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

提前谢谢你,

马修

2 个答案:

答案 0 :(得分:0)

编写基础10数学引擎。

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

迭代二进制数字,跟踪与数字对应的基数10。

有条件积累。

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

遗憾的是,由于二进制数的任何数字都可以影响等效基数10的任何数字,因此有效的方法非常有限。可能有奇特的方式,但300位数你不应该打扰。

答案 1 :(得分:-1)

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

#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 ^幂并加入计数器。如果是0则忽略
  6. 将功率增加1
  7. 将作为答案的计数器转换为字符串
  8. 自己写一个Accumulate()。