Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   "сколько натуральных чисел, не больших заданного K , и имеют в своем двоичном разложе (http://forum.oszone.net/showthread.php?t=256256)

ukrop34ik 13-03-2013 22:44 2110672

"сколько натуральных чисел, не больших заданного K , и имеют в своем двоичном разложе
 
задача состоит в том , что :
"сколько натуральных чисел, не больших заданного K , и имеют в своем двоичном разложении ровно три значащих нуля?" - упростили её тем, что вводится определенное число : например "23". и раскладывается в двоичный код: "10111" и вот нужно посчитать количество этих "0" с выводом сообщения есть там три "0" или нету.

читать дальше »
// 1.cpp: главный файл проекта.

#include "stdafx.h"
#include "stdio.h"
#include "conio.h"
#include "math.h"

void dvoich(int x1)
{
int i,b;
long c=0;
for(i=0; x1>0; i++);
{
b=x1%2;
x1=(x1-b)/2;
c+=b*pow((double)10,i);
}
printf("\nDvoichnoe chislo: $d",c);
}
void main()
{
int a;
printf(" Vvedite desytichnoe chislo:");
scanf_s("%d",&a);
dvoich(a);
getch();
}


но тут приехал я. работать то она работает без ошибок - но только сканит число и все.
что делать дальше мне пока что не понятно.

lxa85 14-03-2013 00:56 2110738

ukrop34ik, У вас я так понимаю получается еще одно число в 10 системе, только состоящее из нулей и единиц.
Т.е. 23(10)=10111(2)=10111(10) / число(система счисления)
"Нарезайте" дальше получившееся число по десятичным разрядам (остаток от целочисленного деления на 10 ) и через логический "флаг" ведите подсчет нулей.
Как будет реализован этот функционал, можно будет помещать все это в цикл от 1 до K.

Вопрос. А размерность long позволит правильно отобразить двоичное представление максимального K ?

Поэтому второй вариант -- усложнить алгоритм и вести подсчет нулей сразу. Плюс ввести булеву переменную в возвращаемый результат.

ukrop34ik 18-03-2013 00:01 2113365

Цитата:

Цитата lxa85
Поэтому второй вариант -- усложнить алгоритм и вести подсчет нулей сразу. Плюс ввести булеву переменную в возвращаемый результат. »

:( я нубас ...
алгоритм то я понял но вот код писать для меня не посильная задача.

lxa85 18-03-2013 07:43 2113427

ukrop34ik, но ведь кто-то алгоритм получения двоичного числа написал! То, что предлагаю я гораздо проще как в понимании, так и в написании. Все необходимые операции работы с переменными находятся в поисковике на раз два.
Поэтому не надо списывать себя в нубасы, лучше сразу в лентяи.

ViRTaCe 18-03-2013 10:39 2113489

Тут даже фактически не всегда целиком надо переводить числа, иногда будет достаточно убедится что в двоичном представлении присутствует три нуля.

P.S. Прошу прощения не заметил, что нужно точное кол-во.

ukrop34ik 20-03-2013 16:12 2115021

таки вроде что то получилось но это дело просто считает количество 0 и 1

#include <iostream>

int main(void)
{
unsigned n, n0 = 0, n1 = 0;
std::cout << "enter a number: ";
std::cin >> n;
while(n > 0)
{
if (n % 2 == 0)
n0++;
else
n1++;
n /= 2;
}
std::cout << "1s: " << n0 << std::endl;
std::cout <<"0s: " << n1 << std::endl;
system("pause");
return 0;
}

lxa85 20-03-2013 18:27 2115082

ukrop34ik, ну вот, хорошо.
А теперь используя составной оператор, усложни обработку n0 и n1 проверкой на превышение порога в 3 идущих подряд значения.
Для этого в простейшем случае тебе понадобятся 2 переменные. Одна для того, чтобы сигнализировать о том, какая идет последовательность (нулей или единиц), вторая о том, что заданный порог достигнут.
Для этого тебе понадобятся "вложенные" ветвления (условные переходы, они же if () {} else {}. )
Т.е. конструктивно:
Код:

if (...){
    if (...){
    }
    else {
    } // if(...)
}
else{
}

P.S. Оформляй пожалуйста код, тегом [code] Знак (#) на панели сверху. Так его читать проще.

ukrop34ik 20-03-2013 18:56 2115110

ок ша покруитм


Время: 02:10.

Время: 02:10.
© OSzone.net 2001-