我正在制作一个程序,将两个二进制数字(最多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];
}
}
}
}
任何想法或建议都将受到赞赏。
编辑:谢谢大家的意见,我让它发挥作用!
答案 0 :(得分:2)
你不应该有那个内循环(在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
而没有任何迹象表明最左边的位是进位可能是:
最后一个块确保你有一些值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;
}
答案 1 :(得分:1)
const char * begin = std::find(c, c+32, '1');
size_t len = c - begin + 32;
std::cout.write(begin, len);
答案 2 :(得分:0)
在同一索引上使用两个fors。第一个用于迭代,而= = 0,第二个打印从第一个离开的位置开始。