Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.65/34: Рейтинг темы: голосов - 34, средняя оценка - 4.65
3 / 3 / 0
Регистрация: 02.02.2020
Сообщений: 69

Найти наибольшую степень двойки, на которую будет делиться введенное число

08.12.2021, 11:18. Показов 7567. Ответов 55

Студворк — интернет-сервис помощи студентам
Здравствуйте! Помогите, пожалуйста, перевести программу из С# в С++

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
static void Main(string[] args)
        {
            Console.Write("Введите число а: ");
            int a = int.Parse(Console.ReadLine());
            int result = 0;
 
            for (int temp = 2; temp <= a; temp *= 2)
                if (a % temp == 0)
                    result = temp;
 
            if (result != 0)
                Console.WriteLine("Наибольшая степень числа 2, делящая данное целое число {0} = {1}", a, result);
            else
                Console.WriteLine("Результат не найден.");
 
            Console.ReadKey();
        }
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.12.2021, 11:18
Ответы с готовыми решениями:

Циклы: Найти наибольшую степень двойки, на которую делится заданное число
Задание 3. Составить программу решения задачи. 3. Найти наибольшую степень двойки, на которую делится заданное число.

Найти максимальную степень двойки, на которую делится данное целое число
Найти максимальную степень 2, на которую делится данное целое число. (Операторами цикла пользоваться нельзя) На C++ нашёл кое-что...

Найти наибольшую степень двойки, не превышающую заданного числа n
Найти наибольшую степень двойки, не превышающую заданного числа n.

55
2163 / 1241 / 511
Регистрация: 11.10.2018
Сообщений: 6,370
09.12.2021, 13:03
Студворк — интернет-сервис помощи студентам
Вы мой код смотрели. Посмотрите повнимательнее. int состоит из 4 байт, поэтому биты нумеруются у него с 0 до 31, СПРАВА НАЛЕВО. Поэтому в моей программе 1 сразу задвигаем на левый край, получаем число, это максимальная степень двойки.
1 2 4 8 Посмотрите как эти числа в бинарном(двоичном) представлении, это просто 1 сдвинутая на сколько-то разрядов вправо. Для этого служат операторы сдвига << и >>.
Делим его и смотрим остаток это операция %. Опять же читайте документацию.
Если остаток есть, то программа продолжит свою работу, т.е. сдвигаем max на 1 вправо и снова делим.
Если поделилось без остатка то break; выход из цикла.
1
3 / 3 / 0
Регистрация: 02.02.2020
Сообщений: 69
09.12.2021, 13:04  [ТС]
Volga_, ДАА, спасибо огромное вам, только на выход идет не p, а i. Все работает, огромное спасибо. А можете обьяснить, что в коде Folian? И как он будет выглядеть, так скажем, в общем коде?(имею ввиду, я так понимаю, что это лишь часть кода, а как будет выглядеть полноценный код с частью кода Folian). Это уже для общего развития, так сказать
0
Модератор
Эксперт CЭксперт С++
 Аватар для Volga_
5209 / 2927 / 1509
Регистрация: 14.12.2018
Сообщений: 5,267
Записей в блоге: 1
09.12.2021, 13:10
Цитата Сообщение от DaniilDemchenko Посмотреть сообщение
А можете обьяснить, что в коде Folian? И как он будет выглядеть, так скажем, в общем коде?(имею ввиду, я так понимаю, что это лишь часть кода, а как будет выглядеть полноценный код с частью кода Folian).
Можно посмотрите: https://iq.opengenus.org/detec... operators/
И он обязательно объяснит вам все.
1
3 / 3 / 0
Регистрация: 02.02.2020
Сообщений: 69
09.12.2021, 13:21  [ТС]
FFPowerMan, извините, но это для меня прям сложно пока что) Я правильно понял, что нумерация идет справа налево, то есть, с 31(лево) до 0(право). Потом вы сделали 1-цу последней в этой нумерации, убрав ноль. Про бинарное представление понял, от 0001 до 1000. Все, понял, спасибо) Только max на вывод не надо (там вообще какие-то числа миллиардного разряда), ну и вместо самого числа (в случае с 1000 на вывод пошло число 8) нужно, чтобы пошла степень, но я думаю, что это поправимо. Спасибо вам за ваши труды!

Добавлено через 48 секунд
ВСЕМ ОГРОМНОЕ СПАСИБО ЗА ПОМОЩЬ!

Добавлено через 1 минуту
Volga_, от блин, все на английском( Ладно, все равно спасибо, переводчик встроенный есть, должен справиться
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
09.12.2021, 13:22
Цитата Сообщение от Volga_ Посмотреть сообщение
Это хороший код как я понимаю.
Это тривиальный и не оптимальный кот. Хороший кот - в главе "Подсчет завершающих нулевых битов" в книге Генри Уоррена "Хакерз Делайт"
1
Гвоздь Задиров
 Аватар для Folian
1719 / 1118 / 337
Регистрация: 25.01.2019
Сообщений: 2,946
09.12.2021, 14:04
Почитал тут.
Цитата Сообщение от DaniilDemchenko Посмотреть сообщение
что в коде Folian
Примерно то же что и у ув-го liv, только без ошибок. И тебе нужен именно его вариант со счётчиком.

Цитата Сообщение от _Ivana Посмотреть сообщение
Хороший кот - в главе "Подсчет завершающих нулевых битов" в книге Генри Уоррена "Хакерз Делайт"
Там их даж несколько. Интересная книжка.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
 
int foo(int n)
{
    //  if(!n) inf??
    if(!n)
    {
        std::cout << "inf";
        return -1;
    }
 
    int count { 0 };
    int pwr { 1 };
    while(!(pwr & n))
    {
        pwr <<= 1;
        ++count;
    }
 
    return count;
}
 
int bar(unsigned x)
{
    int n {};
    x = ~x & (x - 1);
    while(x)
    {
        ++n;
        x >>= 1;
    }
    return n;
}
 
int main()
{
    //int n {};
    //std::cin >> n;
 
    for(int i { 0 }; i < 260; ++i)
        std::cout << i << " : " << foo(i) << " " << bar(i) << "\n";
 
 
    return 0;
}
0
2163 / 1241 / 511
Регистрация: 11.10.2018
Сообщений: 6,370
09.12.2021, 14:24
Цитата Сообщение от DaniilDemchenko Посмотреть сообщение
нумерация идет справа налево, то есть, с 31(лево) до 0(право).
- Да.

Добавлено через 44 секунды
Цитата Сообщение от DaniilDemchenko Посмотреть сообщение
убрав ноль.
- ничего не убирается, просто условие.

Добавлено через 2 минуты
Цитата Сообщение от DaniilDemchenko Посмотреть сообщение
какие-то числа миллиардного разряда),
- ну естественно, целое до 2'147'483'647.
0
848 / 651 / 323
Регистрация: 24.02.2017
Сообщений: 2,297
09.12.2021, 14:42
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;
 
int main() {
    int n,i=0,a;
 
    cin>>n;
    while((1<<i)<=n)
       n%(1<<i)==0 ? a=i++: i++;
    cout<<(1<<a)<<"(i="<<a<<")";
    return 0;
}
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
09.12.2021, 17:00
Цитата Сообщение от Folian Посмотреть сообщение
Там их даж несколько. Интересная книжка.
Воистину. Только вы почему-то настойчиво продолжаете везде пихать
Цитата Сообщение от Folian Посмотреть сообщение
while


Цитата Сообщение от _Ivana Посмотреть сообщение
Хороший кот
вот, например
C++
1
2
3
int m[] = {0, 1, 26, 2, 23, 27, 32, 3, 16, 24, 30, 28, 11, 0, 13, 4, 7, 17, 0, 25, 22, 31, 15, 29, 10, 12, 6, 0, 21, 14, 9, 5, 20, 8, 19, 18, 0};
 
int t(unsigned n) { return m[((n ^ (n-1)) >> 1) % 37]; }
как тебе такое, Илон Маск Folian?

Цитата Сообщение от DaniilDemchenko Посмотреть сообщение
мне его подсказал преподаватель
если хотите сдать и забыть, то пойдет что угодно. Если хотите научиться - найдите нормального преподавателя.
2
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
09.12.2021, 17:17
Цитата Сообщение от Volga_ Посмотреть сообщение
while (n % 2 == 0)
Как думаете, быстрее будет "n & 1 == 0"?
0
Гвоздь Задиров
 Аватар для Folian
1719 / 1118 / 337
Регистрация: 25.01.2019
Сообщений: 2,946
09.12.2021, 17:28
Цитата Сообщение от _Ivana Посмотреть сообщение
Только вы почему-то настойчиво продолжаете везде пихать
Я тупо взял самый короткий, т.к. с пдф не копипастится и лень
Прошёлся по диагонали только; вечером время останется если - почитаю, пока некогда.
Цитата Сообщение от _Ivana Посмотреть сообщение
как тебе такое
Ну такое, да) только откуда 37? Загадочное число)
Миниатюры
Найти наибольшую степень двойки, на которую будет делиться введенное число  
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
09.12.2021, 17:41
Цитата Сообщение от Folian Посмотреть сообщение
Ну такое, да) только откуда 37? Загадочное число)
А этого у Уоррена и нет. Но у нас же и свои мозги есть, не только копипастить можем Все то, что до % 37 - это выставленные единичные биты на том месте, где были начальные нули, а все остальные единицы занулены. Тривиальное преобразование через - 1 (получаем различие в младших нулевых разрядах) и ксор с исходным значением со сдвигом вправо как раз оставляет нам только нужные единицы. А далее остается только их посчитать. Но мы же не глупые студенты, мы не будем считать их через while. Уоррен считает их через бинарный поиск. Уже лучше, но мы чуть-чуть подумаем как можно улучшить. У нас получается всего 32 различных аргумента: 0...01, 0...011 и т.п. И надо для каждого из этих аргументов вернуть число единиц в нем. Можно запихнуть в мапку, но это из пушки по воробьям и не спортивно Предположим, что есть какое-то магическое число, которое будет давать уникальный остаток от деления всех этих возможных аргументов на себя. И если оно не очень велико, мы просто захардкодим массив, где по индексу - остатку от деления аргумента на это число будет лежать количество единичных бит аргумента. Делаем тривиальную проверку (написав простейший тестирующий кот) - вуаля, это число 37! Ближайшее простое число, большее 32. Можем позволить себе отрезать памяти на 37 интов для оптимизации расчетов. А дырки (несущеструющие остатки от деления аргументов на 37) заполняем чем угодно (например, нулями) - все равно они у нас не встретятся при работе функции.
2
Гвоздь Задиров
 Аватар для Folian
1719 / 1118 / 337
Регистрация: 25.01.2019
Сообщений: 2,946
13.12.2021, 21:44
Цитата Сообщение от _Ivana Посмотреть сообщение
Ближайшее простое число, большее 32.
Ага! Смысл ясен.

Цитата Сообщение от _Ivana Посмотреть сообщение
C++
1
((n ^ (n-1)) >> 1) % 37
Только тут, походу, проблемка с нулём будет: от сдвига его колбасит и вылезает 31.
От такое (как раз из книжки) тож самое выдаёт, но без сдвигов ~val & (val - 1)

Для 64 наковырял подобную, вроде работает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
uint32_t foo(uint64_t val)
{
    enum magic { sixseven = 67 };
 
    const uint32_t arr[magic::sixseven] {0, 1, 39, 2, 15, 40, 23, 3, 12, 16,
        59, 41, 19, 24, 54, 4, 
        64 /*эта долька для ноля*/,
        13, 10, 17, 62, 60, 28, 42, 30, 20,
        51, 25, 44, 55, 47, 5, 32, 0, 38, 14, 22, 11, 58, 18, 53, 63,
        9, 61, 27, 29, 50, 43, 46, 31, 37, 21, 57, 52, 8, 26, 49, 45,
        36, 56, 7, 48, 35, 6, 34, 33, 0 };
 
    return arr[(~val & (val - 1)) % magic::sixseven];
}
1
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
13.12.2021, 21:53
Цитата Сообщение от Folian Посмотреть сообщение
Ага! Смысл ясен.
Да, только хорошо бы проверить уникальность остатков от деления на 67 - про ближайшее большее простое число это гипотеза, я ее не доказывал

Цитата Сообщение от Folian Посмотреть сообщение
Только тут, походу, проблемка с нулём будет: от сдвига его колбасит и вылезает 31
Да, но это никакая не проблема - просто на нуле эта функция не определена (ноль делится нацело на любую степень двойки), так что там хоть 31, хоть 32 - все равно неправильно и не будем вообще ее на нуле вызывать

Цитата Сообщение от Folian Посмотреть сообщение
От такое (как раз из книжки) тож самое выдаёт, но без сдвигов ~val & (val - 1)
Вполне возможно, просто ксорный вариант я сам придумал, наверное у Уоррена этот получше

Цитата Сообщение от Folian Посмотреть сообщение
Для 64 наковырял подобную, вроде работает
(хотел смайлик с огнем, но его нет)
1
Гвоздь Задиров
 Аватар для Folian
1719 / 1118 / 337
Регистрация: 25.01.2019
Сообщений: 2,946
13.12.2021, 22:09
Цитата Сообщение от _Ivana Посмотреть сообщение
хорошо бы проверить уникальность остатков
У меня тоже были сомнения и я проверял (тупил "вручную" под чаёк, очень успокаивает )
Цитата Сообщение от _Ivana Посмотреть сообщение
Да, но это никакая не проблема - просто на нуле эта функция не определена (ноль делится нацело на любую степень двойки), так что там хоть 31, хоть 32 - все равно неправильно и не будем вообще ее на нуле вызывать
В рамках задачи - да, но хотелось покрасивше; да и в рамках вообще хорошо когда есть определённость и можно обработать как нужно
1
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
13.12.2021, 22:15
Цитата Сообщение от Folian Посмотреть сообщение
В рамках задачи - да, но хотелось покрасивше
Ну да, согласен, вариант Уоррена красивше моего при тех же затратах на число операций. В общем, вроде осилили задачу. По-хорошему надо помнить про уровни кеша проца и необходимость лазить в память за массивом, даже если он статический, и что на деле алгоритм с бинарным поиском может быть быстрее, ибо не надо лазить в память а хватит регистров, да и остаток от деления не везде искоробки в командах проца / арифметитческого сопроца есть, но это уже для совсем настоящего программирования. Для учебной задачи имхо достаточно красиво
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.12.2021, 22:15

Найти минимальное число, факториал которого будет делиться на определенное число
здравствуйте,есть задача, в ходе которой нужно найти минимальное число m, факториал которого будет делится на определенное число к. т.е....

Определить,делиться ли введённое число
Определить, делится ли введенное число на 5, 11 или 13. Delphi 7.

Найти вероятность того, что наугад взятое 5-значное число будет делиться на 39
Мы решили эту задачу через программу, но не знаем как решить её на бумаге. Ответ получился 2.5%

Пользователь вводит натуральное число. Найти минимальную цифру этого числа и возвести введённое число в степень
Пользователь вводит натуральное число. Найти минимальную цифру этого числа и возвести введённое число в степень , равную минимальной цифре...

Найти наибольшую степень числа 2, делящую данное целое число a
Найти наибольшую степень числа 2, делящую данное целое число a. Помогите написать программу


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
56
Ответ Создать тему
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru