런타임 오류가 나옵니다 roots문제 kksuhj RTE (SIGSEGV: segmentation fault, probably incorrect memory access) 라는 오류가 나옵니다. roots문제를 푸는 중에 나왔는데요 visual studio에서 돌릴때는 아무 이상이 없던 것이 채점시에 문제가 되네요 코드는 아래와 같습니다.. ~~~c++ #include #include #include #include #include #include using namespace std; int testcase,n; vector poly; const double limit=10; void input() { vector empty; double temp; poly=empty; cin>>n; for(int i=0;i<n+1;i++) { cin>>temp; poly.push_back(temp); } } vector differentiate(const vector& p) { vector dif; for(int i=0;i<n;i++) dif.push_back( (n-i)*p[i] ); return dif; } vector solveNaive(const vector& p) { vector ret; //1차식 if(p.size()==2) { ret.push_back(-p[1]/p[0]); }else if(p.size()==3)//2차식 { double a=p[0],b=p[1],c=p[2]; ret.push_back( (-b+sqrt(pow(b,2)-4*a*c))/(2*a) ); ret.push_back( (-b-sqrt(pow(b,2)-4*a*c))/(2*a) ); } sort(ret.begin(),ret.end()); return ret; } double eval(const vector& p, double x) { double ret=0; for(int i=0; i<=n ;i++) ret+=pow(x,n-i)*p[i]; return ret; } vector solve(const vector& p) { int degree=p.size()-1; if(degree<=2) return solveNaive(p); vector<double> ret; vector<double> derivative = differentiate(p); vector<double> sols = solve(derivative); sols.insert(sols.begin(),-limit-1); sols.insert(sols.end(),limit+1); for(int i=0;i<sols.size()-1;i++) { double x1=sols[i],x2=sols[i+1]; double y1=eval(p,x1),y2=eval(p,x2); if(y1*y2>0) continue; if(y1>y2) {swap(y1,y2); swap(x1,x2);} for(int i=0;i<100;i++) { double mx=(x1+x2)/2; double my=eval(p,mx); if(y1*my<=0) { x2=mx; y2=my; }else { x1=mx; y1=my; } } ret.push_back( (x1+x2)/2 ); } sort(ret.begin(),ret.end()); return ret; } int main() { cin>>testcase; while(testcase--) { input(); vector ret(solve(poly));// 이 부분에서 문제인듯 합니다. for(int i=0;i printf("%.8f",ret[i]); } return 0; } ~~~ 마지막에 메인에서 vector ret(solve(poly));에 문제가 있는 듯 한데 어떤식으로 고쳐야 할 지를 잘 모르겠습니다... 도움을 주세요 ㅠㅠ 13년 전
2개의 댓글이 있습니다. Signin 함수 differentiate()과 eval()에서, 반복문 도는 횟수가 항상 n으로 고정되어 문제가 생기는 것 같습니다. 처음 인풋이 5차식으로 들어와도, 극대/극소 위치를 구하기 위해서 식을 미분하다 보면, 차수가 점점 줄어들게 됩니다. 이 경우에 주어진 식은 3차식(원소 4개인 vector)인데 반복문은 5번 돌게 되고, 따라서 존재하지 않는 p[4]를 참조하게 됩니다. 각 함수의 n을 p.size()-1로 바꿔주시면 에러가 나지 않을 것 같습니다. 13년 전 link kksuhj 감사합니다. ㅜㅜ 혼자서 터득해야 하는데 이렇게 힘을 빌리네요 ㅠㅠ 13년 전 link 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.
kksuhj
라는 오류가 나옵니다.
roots문제를 푸는 중에 나왔는데요
visual studio에서 돌릴때는 아무 이상이 없던 것이
채점시에 문제가 되네요
코드는 아래와 같습니다..
~~~c++
#include
#include
#include
#include
#include
#include
using namespace std;
int testcase,n; poly;
vector
const double limit=10;
void input() empty;
{
vector
double temp;
}
vector differentiate(const vector& p) dif;
{
vector
for(int i=0;i<n;i++)
dif.push_back( (n-i)*p[i] );
return dif;
}
vector solveNaive(const vector& p) ret;
{
vector
}
double eval(const vector& p, double x)
{
double ret=0;
for(int i=0; i<=n ;i++)
ret+=pow(x,n-i)*p[i];
return ret;
}
vector solve(const vector& p)
{
int degree=p.size()-1;
}
int main() ret(solve(poly));// 이 부분에서 문제인듯 합니다.
printf("%.8f",ret[i]); ret(solve(poly));에 문제가 있는 듯 한데 어떤식으로 고쳐야 할 지를 잘 모르겠습니다... 도움을 주세요 ㅠㅠ
{
cin>>testcase;
while(testcase--)
{
input();
vector
for(int i=0;i
}
return 0;
}
~~~
마지막에 메인에서 vector
13년 전