2013-10-29 2 views
0

다음의 문제를 해결하기 위해 다음을 작성했습니다. "정렬되지 않은 숫자의 목록이 주어지면 두 숫자 사이의 절대 차이가 가장 작은 숫자를 찾을 수 있습니까? 여러 쌍이 있으면 모두 찾으십시오. " 여기힙 손상 및 프로그램 충돌 발생

는 values.I는 반환 형식으로 포인터를 전달 잘못 아무것도 볼 해달라고 결과를 인쇄 할 때

#include <map> 
#include <set> 
#include <list> 
#include <cmath> 
#include <ctime> 
#include <deque> 
#include <queue> 
#include <stack> 
#include <bitset> 
#include <cstdio> 
#include <limits> 
#include <vector> 
#include <cstdlib> 
#include <numeric> 
#include <sstream> 
#include <iostream> 
#include <algorithm> 
using namespace std; 

int* smallestDiff(vector<int> a,int &noOfPairs) 
{ 
    sort(a.begin(),a.end()); 
    int * arr = new int(a.size()* sizeof(int) *2); 
    bool bfoundDiff = false; 
    int smallestDiff =0; 
    int num1,num2; 
    for(size_t i=0;i<a.size()-1;i++) 
    { 
     num1 = a[i]; 
     num2 = a[i+1]; 

     int newDiff = num2-num1; 
     if(!bfoundDiff || newDiff < smallestDiff) 
     { 
      smallestDiff = newDiff; 
      arr[0] = num1; 
      arr[1]= num2; 
      noOfPairs = 1; 
      bfoundDiff = true; 
     } 
    } 

    for(size_t i=0;i<a.size()-1;i++) 
    { 
     num1 = a[i]; 
     num2 = a[i+1]; 
     int newDiff = num2-num1; 
     if(newDiff == smallestDiff && num1!=arr[0] && num2!=arr[1]) 
     { 
      arr[noOfPairs*2] = num1; 
      arr[noOfPairs*2 + 1] = num2; 
      ++noOfPairs; 
     } 
    } 
    return arr; 
} 
int main() { 

    int _a_size; 
    cin >> _a_size; 
    cin.ignore (std::numeric_limits<std::streamsize>::max(), '\n'); 
    vector<int> _a; 
    int _a_item; 
    for(int _a_i=0; _a_i<_a_size; _a_i++) { 
     cin >> _a_item; 
     _a.push_back(_a_item); 
    } 
    int noOfPairs=0; 
    int *result =smallestDiff(_a,noOfPairs); 
    int noOfelems = noOfPairs*2; 
    for(int i=0;i<noOfelems;++i) 
    { 
     cout<< *(result+i)<<" "; 
    } 
    return 0; 
} 

지금 프로그램이 논리하지만 충돌에 따라 잘 실행되는 코드

입니다.

여기에 문제가 있습니까?

당신은 다음 줄에 오타를했습니다
+0

전달할 입력은 무엇입니까? – lolando

+0

5 항목 수와 숫자가 1 2 3 4 5 – anand

+1

출력이 충돌하는 경우 어떻게 프로그램 논리가 좋은지 어떻게 알 수 있습니까? 나는 int * 배열을 선언하고 그 안에서 포인터를 사용하는 것과 관련이 있다고 생각한다. 벡터로 전환하는 것이 가장 쉽고 최상의 솔루션 인 것 같습니다. – dornhege

답변

2

:

int * arr = new int(a.size()* sizeof(int) *2); 

그것은 다음과 같이해야한다 : 배열을 할당하는 대신

int * arr = new int[a.size()* sizeof(int) *2]; 

당신은 하나의 정수를 할당하고 무엇으로 초기화 크기라고 생각했습니다.

+2

'sizeof (int)'는'new []'에 의해 처리됩니다. – dornhege

+0

어떻게 그럴 수 :( – anand