почему это получило ошибку времени выполнения, только если ввод равен 5?

Это 338-й вопрос Leetcode, Counting Bits. Думаю, я его закончил. Но этот код получает ошибку времени выполнения, когда ввод равен 5? но почему?

вопрос: дано неотрицательное целое число num. Для каждого числа i в диапазоне 0 ≤ i ≤ num вычислить количество единиц в их двоичном представлении и вернуть их в виде массива.

class Solution {
public:
    vector<int> countBits(int num) {
        vector<int> binaryone(num+1);
        binaryone[0]=0;
        if(0==num)
            return binaryone;
        binaryone[1]=1;
        if(1==num)
            return binaryone;
        int w = 1 ;
        int i = 2;
        while(i<=num+1)
        {
            if(i<(pow(2,w-1)+pow(2,w-2)))
            {
                binaryone[i]=binaryone[i-pow(2,w-2)];
            }
            else
            {
                if(i<=(pow(2,w)-1))
                {
                    binaryone[i]=binaryone[i-pow(2,w-2)]+1;
                }
                else
                {
                    if(i==pow(2,w))
                        {
                            w++;
                            binaryone[i]=binaryone[i-pow(2,w-2)];
                        }
                }
            }
            i++;
        }
        return binaryone;
    }
};

person zhaoch93    schedule 28.04.2016    source источник
comment
Похоже, вам может понадобиться научиться использовать отладчик для пошагового выполнения кода. С хорошим отладчиком вы можете выполнять свою программу построчно и видеть, где она отклоняется от того, что вы ожидаете. Это важный инструмент, если вы собираетесь заниматься программированием. Дополнительная литература: Как отлаживать небольшие программы   -  person NathanOliver    schedule 28.04.2016
comment
ваш компьютер наверняка пьян. удали алкоголь и попробуй еще раз   -  person aran    schedule 28.04.2016
comment
pow — это функция для чисел с плавающей запятой. Вы работаете с целыми числами, и степени двойки 2^^n можно записать как 1 << n. Вы также захотите использовать беззнаковые целые числа.   -  person M Oehm    schedule 28.04.2016
comment
Кроме того, изменение на at() вместо использования [ ] для доступа к элементам вектора, скорее всего, даст вам гораздо лучшее сообщение об ошибке, поскольку будет выдано исключение out_of_range.   -  person PaulMcKenzie    schedule 28.04.2016


Ответы (1)


Я не думаю, что это произойдет только с 5, но со всеми вашими входами. Это потому, что вы создали num+1 элементов в своем binaryone векторе:

vector<int> binaryone(num+1);

и ваш цикл while(i<=num+1) индексирует один за концом индексированных элементов, основанных на нуле, что дает вам ошибку времени выполнения. Если у вас есть n элементов, диапазон индекса будет от 0 to n-1.

Поэтому измените условие цикла на: while(i<num+1)

person Biruk Abebe    schedule 28.04.2016