![]() |
"сколько натуральных чисел, не больших заданного K , и имеют в своем двоичном разложе
задача состоит в том , что :
"сколько натуральных чисел, не больших заданного K , и имеют в своем двоичном разложении ровно три значащих нуля?" - упростили её тем, что вводится определенное число : например "23". и раскладывается в двоичный код: "10111" и вот нужно посчитать количество этих "0" с выводом сообщения есть там три "0" или нету. но тут приехал я. работать то она работает без ошибок - но только сканит число и все. что делать дальше мне пока что не понятно. |
ukrop34ik, У вас я так понимаю получается еще одно число в 10 системе, только состоящее из нулей и единиц.
Т.е. 23(10)=10111(2)=10111(10) / число(система счисления) "Нарезайте" дальше получившееся число по десятичным разрядам (остаток от целочисленного деления на 10 ) и через логический "флаг" ведите подсчет нулей. Как будет реализован этот функционал, можно будет помещать все это в цикл от 1 до K. Вопрос. А размерность long позволит правильно отобразить двоичное представление максимального K ? Поэтому второй вариант -- усложнить алгоритм и вести подсчет нулей сразу. Плюс ввести булеву переменную в возвращаемый результат. |
Цитата:
алгоритм то я понял но вот код писать для меня не посильная задача. |
ukrop34ik, но ведь кто-то алгоритм получения двоичного числа написал! То, что предлагаю я гораздо проще как в понимании, так и в написании. Все необходимые операции работы с переменными находятся в поисковике на раз два.
Поэтому не надо списывать себя в нубасы, лучше сразу в лентяи. |
Тут даже фактически не всегда целиком надо переводить числа, иногда будет достаточно убедится что в двоичном представлении присутствует три нуля.
P.S. Прошу прощения не заметил, что нужно точное кол-во. |
таки вроде что то получилось но это дело просто считает количество 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; } |
ukrop34ik, ну вот, хорошо.
А теперь используя составной оператор, усложни обработку n0 и n1 проверкой на превышение порога в 3 идущих подряд значения. Для этого в простейшем случае тебе понадобятся 2 переменные. Одна для того, чтобы сигнализировать о том, какая идет последовательность (нулей или единиц), вторая о том, что заданный порог достигнут. Для этого тебе понадобятся "вложенные" ветвления (условные переходы, они же if () {} else {}. ) Т.е. конструктивно: Код:
if (...){ |
ок ша покруитм
|
Время: 02:10. |
Время: 02:10.
© OSzone.net 2001-