2012-06-21 1 views
0

Я пытаюсь запустить программу и ИНОГДА Я получаю эту ошибку при попытке компиляциипрограмма падает после выхода

л.д. возвращается 1 выход статус

Хотя, когда он компилирует (как я уже сказал, не всегда) и пытаясь поместить определенный вход, программа выдает ответ ... а затем сработает. Можно ли вообще это сделать?

Вот мой код:

#include <iostream> 
#include <vector> 
#include <cmath> 
#include <algorithm> 
using namespace std; 

int main() { 
    bool flag; 
    int n,x[] = {1,-1}; 
    long long int A,cont,mul,acum; 
    while(cin >> n >> A) { 
    acum = 0; 
    vector<long long int> nums(n),nums2; 
    for(int i=0;i<n;i++) cin >> nums[i]; 

    sort(nums.begin(),nums.end()); 

    for(int i=n-1;i>=0;i--) { 
     flag = 1; 
     for(int j=0;j<i and flag;j++) if(nums[i]%nums[j] == 0) flag = 0; 
     if(flag) nums2.push_back(nums[i]); 
    } 

    n = nums2.size(); 

    vector<long long int> mult(n,0); 

    const long long int num = (1<<n); 
    for(int i=0;i<num;i++) { 
     cont = 0, mul = 1; 
     for(int j=n-1;j>=0;j--) if(i & (1<<j)) cont++, mul *= nums2[j]; 
     mult[cont-1] += A/mul; 
    } 

    for(int i=0;i<n;i++) acum += (x[i%2]*mult[i]); 

    cout << acum << endl; 
    } 
    return 0; 
} 

и это вход Я ставлю, когда программа падает:

17 1000 
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 
+1

какое сообщение вы получите при аварии? – Andrew

+0

@hinafu, в качестве оповещения вы забыли '#include '. –

+0

Ошибки компилятора иногда могут быть результатом того, что некоторые из них не поддерживают 'и' как '&&'. – chris

ответ

3

Если запустить программу в отладчике, вы увидите, что проблема возникает на линии

mult[cont-1] += A/mul; 

, когда cont равно 0, что означает, что вы пытаетесь изменить элемент -1 из вектор.

Я не могу сказать, что алгоритм пытается сделать, поэтому я не могу сказать, почему cont может закончиться нулевым.

Общий совет: научитесь использовать отладчик. Это твой друг. :)

+0

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

+0

, но я все еще смущен, почему программа выводит ответ, когда выходная строка находится после строки, где проблема (была) – hinafu

+1

Вы не говорите, какой компилятор вы используете, но вы, вероятно, компилируете свою оптимизированную программу и не отлаживать. Вероятно, ваши библиотеки STL не выполняют проверку векторных границ в оптимизированном режиме, а это означает, что вместо сбоя в строке выше он просто бесшумно разлагает память. Повреждение проявляется до тех пор, пока все объекты не будут уничтожены в конце программы. Почти всегда вы хотите, чтобы ваша программа проходила с использованием отладочной компиляции и только переключилась на оптимизацию, когда вы закончите, и вам нужна дополнительная скорость. –

 Смежные вопросы

  • Нет связанных вопросов^_^