我正在编写一个程序,将两个二进制数(最多 31 位)相加并以二进制形式输出和。
我的一切都很好,但我需要从解决方案中删除前导零。
这是我的输出:
char c[32];
int carry = 0;
if(carry == '1')
{
cout << carry;
}
for(i = 0; i < 32; i++)
{
cout << c[i];
}
我试过了,但没用:
char c[32];
int carry = 0;
bool flag = false;
if(carry == '1')
{
cout << carry;
}
for(i=0; i<32; i++)
{
if(c[i] != 0)
{
flag = true;
if(flag)
{
for(i = 0; i < 32; i++)
{
cout << c[i];
}
}
}
}
如有任何想法或建议,我们将不胜感激。
编辑:感谢大家的投入,我让它工作了!
最佳答案
你不应该有那个内循环(在 if(flag)
内)。它干扰了外层循环的i
处理。
此时您要做的就是在设置了标志的情况下输出字符。
最重要的是,位的打印应该在第一位的检测之外。
以下伪代码显示了我将如何处理此问题:
set printing to false
if carry is 1:
output '1:'
for each bit position i:
if c[i] is 1:
set printing to true
if printing:
output c[i]
if not printing:
output 0
可能需要更改第一段代码以准确输出带进位的数字。例如,如果您最终得到值 2 和一个进位,您可能想要:
1:10 (or some other separator)
100000000000000000000000000000010 (33 digits)
简单地输出 110
而没有指示最左边的位是进位可以是:
- 2 进位;或
- 6 无进位
最后一个 block 确保您有一些值 0 的输出,否则将不打印任何内容,因为没有 1 位。
我将由您决定是应该在进位和值之间输出一个分隔符(并将该行注释掉)还是使用进位来强制 printing
最初为 true。这两个选项分别是:
if carry is 1:
output '1 '
和:
if carry is 1:
output 1
set printing to true
而且,既然您已经在评论中完成了到 C++ 的转换,那应该没问题。你说它不起作用,但我输入了你的代码并且它工作正常,输出 10
:
#include <iostream>
int main(void)
{
int i;
int carry = 0;
int c[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0};
bool print = false;
// This is the code you gave in the comment, slightly modified.
// vvvvvv
if(carry == 1) {
std::cout << carry << ":";
}
for (i = 0; i < 32; i++) {
if (c[i] == 1) {
print = true;
}
if (print) {
std::cout << c[i];
}
}
// ^^^^^^
std::cout << std::endl;
return 0;
}
关于C++删除二进制数组中的前导零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7439306/