CPP полномочия 2-го алгоритма - PullRequest
0 голосов
/ 28 ноября 2018

поэтому я хочу, чтобы этот код мог рассчитывать точное количество степеней 2, но он не остановится, пока я не введу нечетное число в консоль, какие-нибудь исправления в моем коде?Большое спасибо заранее
введите код здесь:

#include <iostream>
using namespace std;
int main()
{
    int a;
    int counter=0;
    cin >> a;
    while(true){
        cin >> a;
        if(a%2==1)
            break;

            a/=2;
            counter=counter+1;  
    }
    cout << counter;
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Если вы хотите оценить все входные мощности, равные двум, я бы использовал двойное значение в качестве входного значения, чтобы получить показатель степени меньше нуля (0,5, 0,25 и т. Д.).

С этой целью из-зак тому факту, что двойные числа выражаются в формате с плавающей запятой двойной точности (как определено в стандарте IEEE 754-2008), вам следует только проверить, что нормализованная дробь получена после разложения числа с помощью std :: frexp (https://en.cppreference.com/w/cpp/numeric/math/frexp) равно 0,5:

#include <cmath>

bool isPowerOfTwo(double a)
{
    int exp;
    return std::frexp(a, &exp) == 0.5;
}

Тогда код:

#include <cmath>
#include <iostream>

bool isPowerOfTwo(double a)
{
    int exp;
    return std::frexp(a, &exp) == 0.5;
}

int main() {
    unsigned counter = 0;

    while (true) {
        double input;
        std::cin >> input;
        if (!isPowerOfTwo(input)) {
            break;
        }
        counter++;
    }
    std::cout << "Number of inputs power of 2: " << counter << std::endl;
    return 0;
}
0 голосов
/ 28 ноября 2018

Вам не хватало некоторых вещей:

  • вы не принимали входные данные, как хотите.
  • ваша процедура подсчета была неправильной.

Soln:

  • Если число n является степенью 2, то операция and для n и n - 1 должна быть 0. И во всехВ других случаях результат не 0.Скажем,

    n = 4 (in binary it is 100)
    n - 1 = 3 (in binary it is 11)
    n & (n - 1) = 0
    
      100 (4)
    & 011 (3)
    -----------
      000 (0)
    
  • используйте эту технику

    #include <iostream>
    using namespace std;
    
    int main()
    {
        int tests, a;
        int counter = 0;
        cin >> tests;
        for (int i = 0; i < tests; i++) 
        {
            cin >> a;
            if ((a & (a - 1)) == 0)
                counter = counter + 1;
        }        
        cout << counter;
        return 0;
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...