2014-10-11 115 views
0
#include<iostream> 
#include<iterator> 
#include<vector> 
#include<algorithm> 
using namespace std; 

int main (void) 
{ 
    int z,foo,t,n,k,i; 
    cin>>t; 
    while (t--) 
    { 
     vector<int> a; 
     vector<int> b; 
     cin>>n>>k; 
     z = n; 
     while (z--) 
     { 
      cin>>foo; 
      a.push_back(foo); 
     } 
     sort(a.begin(),a.end()); 
     vector<int>::iterator it = a.begin(); 
     vector<int>::iterator bt = a.begin(); 
     while (bt != a.end()) 
     { 
      bt = bt + (k-1); 
      foo = *bt - *it; 
      b.push_back(foo); 
      it++; 
     } 
     sort(b.begin(),b.end()); 
     cout<<b[0]<<"\n"; 
    } 
    return 0; 
} 

此代码接受的测试用例的数量,然后接受两个号码,然后采取了一系列数字的总数,并对其进行排序,取的k的基础上,他们的差异,对它们进行分类,在一个新的载体拷贝和对它们进行排序并输出一个新元素。这个C++代码在给出分段错误时出了什么问题?

上面的代码给出了分段错误。

+0

为什么* bt和* it? – Rustam 2014-10-11 05:47:05

+1

你输入'k'是什么?保证'bt = bt +(k-1)'不发送'bt'超出范围的地方在哪里? – AnT 2014-10-11 05:49:25

+0

您是否在调试器中运行代码以查找崩溃发生的位置? – Wyzard 2014-10-11 05:50:14

回答

2

您正在移动的周期

bt = bt + (k-1); 

的每次迭代bt通过k - 1步骤bt初始值是a.begin()和循环继续条件是bt != a.end()。如果a(即n)的大小不能被k - 1整除,bt将永远不会等于a.end(),并且该循环将永远不会正确终止。它会将bt推出有效范围。

此时行为将是未定义的。代码通常会崩溃。

相关问题