我正在学习C ++并试图解决编程挑战中的问题。我被困在解决快乐的跳投。为了达到目的,我的程序运行但是在输入第一行并获得输出之后,出现了分段错误。这是我的代码:
#include <iostream>
#include <cmath>
using namespace std;
bool is_jolly(int *list, int cap, bool* container){
int difference = 0;
for(int i=0; i<cap-1; i++){
difference = list[i] - list[i+1];
if(abs(difference) < cap && abs(difference) >= 1 && container[difference] == false){
container[difference] = true;
continue;
}
else return false;
}
return true;
}
int main(){
int n;
bool used[30001];
while(cin >> n){
int * num_list = new int[n];
for(int i=0; i<n; i++){
cin >> num_list[i];
used[i+1] = false;
}
if(is_jolly(num_list,n,used))
cout << "Jolly" << endl;
else cout << "Not Jolly" << endl;
delete[] num_list;
}
return 0;
}
答案 0 :(得分:3)
如果差异可能为负(例如,在输入2 0 10000
上),则container[difference]
使用否定索引(例如container[-10000]
),这将导致段错误
for(int i=0; i<cap-1; i++){
difference = list[i] - list[i+1];
if(abs(difference) < cap && abs(difference) >= 1 && container[difference] == false){
而是使用:
for(int i=0; i<cap-1; i++){
difference = abs(list[i] - list[i+1]);
if(difference < cap && difference >= 1 && container[difference] == false) {
....如果那是你想要的(我不知道目的是什么)