2

我目前被困在一项任务中,几乎到处都在寻找我正在尝试做的事情的提示。

赋值很简单,我们将得到一个向量形式的二进制数(例如[1,1,1,1],我们要计算这个数字的十进制形式并放回相同的向量形式(例如,[1,5] 是前面例子的答案)。

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

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

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

先感谢您,

马修

4

2 回答 2

0

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

它应该包括另一个基数为 10 的数字的加法和乘法int。(翻倍就够了)

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

有条件的积累。

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

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

于 2013-09-18T18:27:07.347 回答
-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^power 并添加到计数器。如果为0则忽略
  6. 将幂增加 1
  7. 将作为答案的计数器转换为字符串
  8. 自己编写 Accumulate()。
于 2013-09-18T18:45:56.440 回答