Есть ли в машинном представлении целого числа одинаковое количество нулей и единиц - C (СИ)
Формулировка задачи:
Собственно, сам текст задачи в заголовке. Код программы я написал, но почему-то после введения самого числа программы ничего не выводит и нажатие enter ни к чему не приводит. Где у меня есть какие-то недоработки?
#include <stdio.h>
#include <math.h>
int main(void)
{
int ost,n,k,odin,noll;
printf("vvedite chislo\n");
scanf(" %d ",&n);
noll=0; odin=0;
k=n;
if (n==0) printf("neravnoe kolichestvo nulei i ediniz");
else if (n>0) {
while (n>0) {
ost = n%2;
if (ost==0) noll+=1;
else if (ost==1) odin+=1;
n=n/10;
}
noll=noll + (sizeof(int)*8-(noll+odin));
}
else if (n<0) {
n=-n;
while (n>0) {
int flag=0; //зная, что будет инвертирование битов, считаю кол-во наоборот.
//Так как потом будет прибавляться единица, возможно замещение
//полученных единиц нулями до первого нуля, который станет единицей.
//Пока этого не произошло flag=0
ost = n%2;
n=n/10;
if (ost==0 && flag == 0)
noll+=1;
else if (ost==0 && flag == 1)
odin+=1;
else if (ost==1 && flag == 0) {
odin+=1;
flag = 1;
}
else if (ost==1 && flag == 1)
noll+=1;
}
noll=noll + (sizeof(int)*8-(noll+odin));
}
if (k!=0 && noll==odin) printf("odinakovoe kolichestvo nulei i ediniz");
else if (k!=0 && noll!=odin) printf("neravnoe kolichestvo nulei i ediniz");
return 0;
}Решение задачи: «Есть ли в машинном представлении целого числа одинаковое количество нулей и единиц»
textual
Листинг программы
for(ed=nul=0; n; ) {
if (n&1) ed++;
else nul++;
n = (n>>1);
}
Объяснение кода листинга программы
В данном коде выполняется подсчет количества нулей и единиц в машинном представлении целого числа.
- Переменная
nинициализируется значением, равным данному целому числу. - Переменная
edинициализируется нулем и используется для подсчета количества единиц. - Переменная
nulинициализируется нулем и используется для подсчета количества нулей. - В цикле происходит следующее:
- Проверяется, является ли самый младший бит числа единицей (n&1). Если да, то к переменной
edприбавляется единица. - Если самый младший бит числа равен нулю, то к переменной
nulприбавляется единица. - Число
nсдвигается вправо на один бит (n>>1). - Цикл продолжается до тех пор, пока число
nне станет равным нулю. Таким образом, после выполнения данного кода, в переменнойedбудет содержаться количество единиц, а в переменнойnul- количество нулей в машинном представлении данного целого числа.
- Проверяется, является ли самый младший бит числа единицей (n&1). Если да, то к переменной