2016-04-28 2 views
0

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

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

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; 
    } 
}; 
+5

Это звучит, как вы, возможно, потребуется, чтобы узнать, как использовать отладчик для пошагового кода. С хорошим отладчиком вы можете выполнить свою программу по очереди и посмотреть, где она отклоняется от ожидаемого. Это важный инструмент, если вы собираетесь заниматься программированием. Дальнейшее чтение: ** [Как отлаживать небольшие программы] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/) ** – NathanOliver

+1

ваш компьютер, безусловно, пьян. удалить алкоголь и повторить попытку –

+2

[Не использовать pow() для вычисления целых значений] (http://stackoverflow.com/questions/25678481/why-pown-2-return-24-when-n-5/25678721#25678721) – PaulMcKenzie

ответ

2

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

vector<int> binaryone(num+1);

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

Таким образом изменить условие цикла к: while(i<num+1)