물론 단번에 코드를 본다면 좋기야 하겠지만 장기적으로 봤을 때
혼자 풀어보기 -> 힌트 -> 코드 보기 순으로 공부하시는 게 실력 향상에 큰 도움이 됩니다!
힌트를 보고 천천히 생각을 거쳐서 문제를 풀어보시고
답안을 확인해보세요
더보기
1. 삼차방정식의 계수를 입력받는다.
2. 삼차식의 계수가 0이 아닐경우를 먼저 생각해준다.
3. 도함수의 판별식을 이용하여 최초함수의 근의 개수를 기준으로 나누어준다.
if( (4*b*b-12*a*c) > 0 ) ※판별식이 > 0 경우
x0=(-2*b-sqrt(4*b*b-12*a*c))/(6*a)
x1=(-2*b+sqrt(4*b*b-12*a*c))/(6*a)
if( (f(x0)*f(x1)) < 0 ) ※실근의 개수가 3개인 경우
else if((f(x0)*f(x1))==0) ※실근의 개수가 2개인 경우
if(fabs(f(x0))==0) ※실근의 개수가 1개인 경우
else (fabs(f(x1))==0)
else f( (f(x0)*f(x1)) > 0 ) ※실근의 개수가 1개인 경우
4. else ※판별식이 <= 0 경우
else(a==0 && b==0 && c==0 && d==0)
5. 2차방정식의 근을 구하는 방법 모두 생각해 준다.
더보기
#include <stdio.h>
#include <math.h>
#define EPSIL 1.e-10
#define MAX 10000.
#define MIN -10000.
double a,b,c,d;
double f(double x)
{
return (a*x*x*x+b*x*x+c*x+d);
}
double solve(double a ,double b)
{
double center;
do
{
center=(a+b)/2;
if(f(a)*f(center)>0) a=center;
else b=center;
}
while(fabs(f(center))>EPSIL);
return center;
}
void main(void)
{
printf("\n 3차 방정식의 기본형은 다음과 같습니다.");
printf("\n\n a x^3 + b x^2 + c x + d = 0 ");
printf("\n\n 계수 a, b, c, d를 입력하세요.\n");
printf("\ta : ");
scanf("%lf", &a);
printf("\n\tb : ");
scanf("%lf", &b);
printf("\n\tc : ");
scanf("%lf", &c);
printf("\n\td : ");
scanf("%lf", &d);
double x0,x1, low=MIN, upper=MAX; /*삼차방정식일때 사용할 변수 선언*/
double x, y, z, D; /*2차방정식일때 사용할 변수 선언*/
if(a!=0) /*3차항의 계수가 0이아닌 삼차방정식의 경우*/
{
if(a<0) /*a가 음수일 경우는 한계값을 바꿔준다*/
{
low=MAX;
upper=MIN;
}
if((4*b*b-12*a*c)>0) /*도함수의 판별식>0일 경우*/
{
x0=(-2*b-sqrt(4*b*b-12*a*c))/(6*a);
x1=(-2*b+sqrt(4*b*b-12*a*c))/(6*a);
if((f(x0)*f(x1))<0)
{
printf(" 근의 수는 세개이며 값은 다음과 같습니다.\n");
printf("\tx = %lf\n",solve(x0,x1));
printf("\tx = %lf\n",solve(low,x0));
printf("\tx = %lf\n",solve(x1,upper));
}
else if((f(x0)*f(x1))==0)
{
printf(" 근의 수는 두 개이며 값은 다음과 같습니다.\n");
{
if(fabs(f(x0))==0)
{
printf("\tx = %lf\n",x0);
printf("\tx = %lf\n",solve(x1,upper));
}
else if(fabs(f(x1))==0)
{
printf("\tx = %lf\n",x1);
printf("\tx = %lf\n",solve(low,x0));
}
}
}
else if((f(x0)*f(x1))>0) {
printf(" 근은 한 개이며 값은 다음과 같습니다.\n");
printf("\tx = %lf\n",solve(low,upper));
}
}
else if((4*b*b-12*a*c)<=0) /*도함수의 판별식이<=0일 경우*/
{
printf(" 근은 한 개이며 값은 다음과 같습니다.\n");
printf("\tx = %lf\n",solve(low,upper));
}
}
// 3차항의 계수가 0일 경우 2차방정식의 해법으로 풀어준다
else if(a==0 && b==0 && c==0 && d==0)
{printf(" 근이 무수히 많습니다.\n");
}
else if(a==0 && b==0 && c==0 && d!=0)
{printf(" 근이 존재하지 않습니다.\n");
}
else if(a==0 && b==0)
{printf("\tx = %lf\n", -d/c);
}
else if(a==0)
{
D=c*c-4*b*d;
if(D==0)
{
x=-(c/2);
printf(" 이차방정식의 중근 x = %lf\n", x);
}
else if(D>0)
{
y=(-c+sqrt(D))/2;
z=(-c-sqrt(D))/2;
printf(" 이차방정식의 두근 x= %lf, %lf\n", y, z);
}
else printf(" 근이 없습니다.\n");
}
}
더 많은 C언어 글이 궁금하다면?
https://chuinggun.tistory.com/category/C%EC%96%B8%EC%96%B4
댓글