已关闭。此问题需要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循环中,我用它来反转字符串。
2条答案
按热度按时间sdnqo3pr1#
有几种方法可以解决这个问题。对问题中的代码最直接的修复是修复循环:
请注意三个变化:循环仅运行到
size / 2
;一路运行会将字符串反转两次,所以字符串最终不会改变。第二次访问的索引是size - i - 1, not
size - i; and the code uses
std::swap, not simply assignment. (I also changed
atto
[]';使用正确编写的循环,不需要检查索引是否有效)。但是还有一种更简单的方法,使用
std::reverse
即可:更妙的是,不要反转字符串,只需稍微改变一下算法:
0wi1tuuw2#
我发现了一个紧迫的问题:
当
i
为0
时,BinaryInteger.at(size - i)
访问越界,at
将引发异常。即使这是调整工作,如果我们这样交换,我们应该只走了一半,否则你最终交换字符 * 回到 * 他们原来的顺序。
稍微了解一下
algorithms
库1,这就简单多了。使用rbegin
和rend
,我们可以向后迭代字符串,而不必先反转整个字符串。从
0
的初始值开始,我们可以使用std::accumulate
来 * 累加 * 最终结果。为了帮助实现这一点,我们将在lambda中捕获power
by reference,这样我们就可以在每次迭代中递增它,从而允许我们适当地构建基数。从那里开始,数学就非常简单了。1一些函数式编程的经验也没什么坏处。