У вас не должно быть этого внутреннего цикла (внутри 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 без переноса
Последний блок гарантирует, что у вас есть выход для значения 0, который в противном случае ничего не печатал бы, поскольку не было 1 бита.
Iоставим на ваше усмотрение, следует ли вам выводить разделитель между переносом и значением (и оставлять эту строку закомментированной) или использовать перенос, чтобы изначально принудительно установить 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;
}