尝试将二进制转换为数字,在C++中将二进制的输入作为字符串,但是,我不知道为什么它不工作?[closed]

u2nhd7ah  于 2022-12-20  发布在  其他
关注(0)|答案(2)|浏览(112)

已关闭。此问题需要details or clarity。当前不接受答案。
**想要改进此问题?**添加详细信息并通过editing this post阐明问题。

2天前关闭。
Improve this question
下面是该程序的代码:

#include <iostream>
#include <string>
using namespace std;

int binary_to_number(string BinaryInteger) {
    int sum{0};
    int powers_of_2{1};
    size_t size{BinaryInteger.size()};

    //reversing the string
    for (size_t i{0}; i< size; i++) {
        BinaryInteger.at(i) = BinaryInteger.at(size - i);
    }
    //calculatiing the value of digit
    for (auto digit : BinaryInteger) {
        // as '1' in ascii code is 49, and '0' in ascii code is 48,
        // so, '1' - '0' will give the integer 1.
        digit = digit - '0';
        sum += digit*powers_of_2;
        powers_of_2 *= 2;
    }
    return sum;
}

int main() {
    string n;
    cin >> n;
    cout <<  binary_to_number(n) << endl;
    return 0;
}

无法判断输出是什么,因为没有打印任何内容(无错误,无输出)。
但是,我认为问题出在for循环中,我用它来反转字符串。

sdnqo3pr

sdnqo3pr1#

有几种方法可以解决这个问题。对问题中的代码最直接的修复是修复循环:

for (std::size_t i = 0; i < size / 2; ++i)
    std::swap(BinaryInteger[i], BinaryInteger[size - i - 1];

请注意三个变化:循环仅运行到size / 2;一路运行会将字符串反转两次,所以字符串最终不会改变。第二次访问的索引是size - i - 1, not size - i ; and the code uses std::swap , not simply assignment. (I also changed at to []';使用正确编写的循环,不需要检查索引是否有效)。
但是还有一种更简单的方法,使用std::reverse即可:

std::reverse(BinaryInteger.begin(), BinaryInteger.end());

更妙的是,不要反转字符串,只需稍微改变一下算法:

for (auto digit : BinaryInteger)
    sum = sum * 2 + digit - '0';
0wi1tuuw

0wi1tuuw2#

我发现了一个紧迫的问题:

for (size_t i{0}; i< size; i++) {
       BinaryInteger.at(i) = BinaryInteger.at(size - i);
   }

i0时,BinaryInteger.at(size - i)访问越界,at将引发异常。
即使这是调整工作,如果我们这样交换,我们应该只走了一半,否则你最终交换字符 * 回到 * 他们原来的顺序。
稍微了解一下algorithms库1,这就简单多了。使用rbeginrend,我们可以向后迭代字符串,而不必先反转整个字符串。
0的初始值开始,我们可以使用std::accumulate来 * 累加 * 最终结果。为了帮助实现这一点,我们将在lambda中捕获powerby reference,这样我们就可以在每次迭代中递增它,从而允许我们适当地构建基数。从那里开始,数学就非常简单了。

#include <string>
#include <cmath>
#include <numeric>
#include <iostream>

int binary_to_number(std::string bin) {
    int power = 0;
    return std::accumulate(
        bin.rbegin(), bin.rend(), 0, 
        [&power](int result, char ch){ 
            int base = std::pow(2, power++);
            int digit = ch - '0';
            return result + base * digit; 
        }
    );
}

int main() {
    std::string bin = "101";

    std::cout << binary_to_number(bin)
              << std::endl;
}

1一些函数式编程的经验也没什么坏处。

相关问题