为什么只有输入为5时才会出现运行时错误?

问题描述:

这是Leetcode,Counting Bits的第338个问题。我认为我完成了它。 但是,输入为5时,这些代码会得到运行时错误?但为什么?为什么只有输入为5时才会出现运行时错误?

问题是: 给定一个非负整数num。对于范围0≤i≤num中的每个数字i,计算其二进制表示中的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://*.com/questions/25678481/why-pown-2-return-24-when-n-5/25678721#25678721 ) – PaulMcKenzie

我不认为这只会发展到5,但对所有的投入。这是因为你创造了你的binaryone矢量num+1元素是:

vector<int> binaryone(num+1);

和你的循环while(i<=num+1)正在索引一个过去的结束,零基础索引,元素给你一个运行时错误。如果您有n元素,则指数范围将从0 to n-1

因此改变你的循环条件: while(i<num+1)