Вопрос о двоичной строке, чтобы найти максимальную мощность 2

#c #string #math #bit

#c #строка #математика #бит

Вопрос:

Мы дали двоичную строку длиной n, мы можем циклически сдвигать эту строку любое количество раз.Пусть X — десятичное представление строки s. Найдите наибольшую степень 2, с которой X может быть делимым, если оно может быть делимым с произвольно большой степенью печати «-1».Для получения результата вам необходимо напечатать одно целое число, обозначающее максимальную степень 2, на которую X может быть делимым. пример: Ввод: 0011 Вывод: 2

Объяснение: мы можем циклически сдвигать строку 2 раза, чтобы получить «1100», которое делится на 2 ^ 2, следовательно, ответ равен 2.

Вот мое решение.. однако это дает мне tle в большинстве тестовых примеров и неправильный ответ в некоторых тестовых примерах..

 int highestpower(int n)
{
    return (n amp; (~(n - 1)));
}

int findnum(string s)
{
    int value = 0;
    int p=0;
    for(int i = s.length()-1;i>=0;i--)
    {
        value = value pow(2,p)*(s[i]-'0');
        p  ;
    }
    return value;
}

int maximumPower(string s) {
    int ans = 0;
    for(int i=0;i<s.length();i  )
    {
        
        int num = findnum(s.substr(i) s.substr(0,i));
        ans = max(ans,highestpower(num));
    }
    return ans/2;
}
  

как я могу решить этот ответ?Спасибо..

Комментарии:

1. Почему бы просто не попытаться найти подмассив максимальной длины из последовательных нулей циклическим способом?

2. Можете ли вы, пожалуйста, объяснить вашу оценку?

Ответ №1:

Мне трудно понять логику вашего кода. На практике это не удалось практически во всех случаях, которые я тестировал.

Более того, это кажется довольно сложным. Достаточно посчитать количество последовательных нулей. Мы просто должны обратить внимание, что это вычисление должно выполняться циклическим способом. Например, если s == 00100 число отсчета равно 4, как после сдвига, мы получаем 10000 . Один из простых способов справиться с этой цикличностью — объединить строку s2 = s s = 0010000100 , а затем подсчитать максимальное количество последовательных нулей в полученной строке s2 . Кроме того, мы должны обратить внимание, что входная строка состоит не только из нулей.

В следующем коде я сравнил ваш код ( maximumPower ) с моим ( maximumPower_new ) на нескольких разных входах.

Результат:

 0011    : 2  new: 2
0100010 : 4  new: 3
00100   : 8  new: 4
  

Код:

 #include <iostream>
#include <string>
#include <cmath>
#include <algorithm>

int highestpower(int n)
{
    return (n amp; (~(n - 1)));
}

int findnum(const std::stringamp; s)
{
    int value = 0;
    int p=0;
    for(int i = s.length()-1;i>=0;i--)
    {
        value = value pow(2,p)*(s[i]-'0');
        p  ;
    }
    return value;
}

int maximumPower(const std::stringamp; s) {
    int ans = 0;
    for(int i = 0; i < s.length(); i  )
    {
        int num = findnum(s.substr(i) s.substr(0,i));
        ans = std::max(ans,highestpower(num));
    }
    return ans/2;
}

int maximumPower_new (const std::stringamp; s) {
    int n = s.length();
    if (n == 0) return -1;
    std::string s2 = s   s;
    int count = 0;
    int count_max = 0;
    for (auto c: s2) {
        if (c == '0') {
            count   ;
        } else {
            count_max = std::max(count, count_max);
            count = 0;
        }
    }
    count_max = std::max(count, count_max);
    if (count_max >= n) return -1;
    else return count_max;
}

int main() {
    for (std::string s: {"0011", "0100010", "00100"}) {
        std::cout << s << " : " << maximumPower(s) << " new: " << maximumPower_new(s) << "n";
    }
}
  

Комментарии:

1. Не могли бы вы объяснить, почему мы находим подмассив максимальной длины из последовательных нулей? В моей оценке я просто поворачиваю строку, вычисляю десятичное значение и просто нахожу максимальную мощность 2.

2. Я просто считаю 0 ( count ), пока не получу 1. Если это так (! = 0), то я сбрасываю счетчик. Я запоминаю в count_max максимальное количество, полученное до сих пор.

3. Да, я понял, как найти максимальные нули, но почему мы находим максимальные нули, есть ли какая-либо связь между поиском максимальных нулей и максимальной степенью 2, которая может разделить число?

4. Если вы найдете m последовательных нулей, то вы можете разделить на 2 ^ m после определенного поворота. Небольшая трудность заключается в том, чтобы учесть тот факт, что у нас может быть несколько нулей как в начале, так и в конце строки. Преимущество использования только строки и символов, без int, заключается в том, что мы избегаем потенциальных проблем с переполнением. Более того, нам не нужно выполнять вращения на практике.