tmdghks9574   3년 전

우선 b / a 가 float이면 세 실근(중근도 있을수있음) 이 존재하고 (허근이 있을경우 둘이 더함 0이라 하나의 정수근 만족을 몬하니) 

b / a 가 정수면 그 정수값을 넣엇을때 0이 되면 실근 한개 찾았으니 조립제법해서 판별식 때리고

d = 0 이면 실근 0하나 존재하니 똑같이 판별식 때리고,

위 두가지가 아니면 실근을 찾을때 다돌면 타임오버 뜨니까 세근의 곱이 abr 인걸 생각해서 

for(int i  = 1; i <= sqrt(d); i++)

해서 i or d / i가 나눠 떨어지면 실근 하나찾았으니 break하고 똑같이 조립제법 판별식 답출력 이런식으로

할라고 하는데 뭐 문제댈꺼 없을까요? 이런식으로 좀 끄적끄적햇더니 틀려씁니다, 런타임에러, 줄줄이나왔는데 ㅠ

어캐푸렁 ㅠㅠㅠㅠㅠㅠㅠㅠ

sait2000   3년 전

그냥 -1000000부터 1000000까지 다 확인해보면 안 되나요

sait2000   3년 전

그리고 확인에 double을 쓰면 안 됩니다 아마도. double은 2^53보다 큰 정수를 정확히 표현하지 못 할 수 있습니다.

tmdghks9574   3년 전

다확인했더니 시간초과 나오던데 시간초과 안나오셨나요..??

tmdghks9574   3년 전

-1000000 부터 1000000 까지 확인하면 편한데 그럼 오버플로우 날거같아서 각항을 a로 나누자니 long long이 안대고... 오버플로우를 방지할라면 어캐해야할까요...?

sait2000   3년 전

계수가 다 정수고 근인지 확인하는 수도 정수라는 점을 고려하면서 잘 생각해보세요. 그냥 식의 값을 계산하는 거 말고 다른 방법이 있습니다.

tmdghks9574   3년 전

ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ 힌트라도 읍나요 ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ 후 해보겠습니다 ㅠ

sait2000   3년 전

힌트를 드리자면 배수 약수의 개념을 정수로 확장해서 생각해보면 x가 정수이고 Ax^3 + Bx^2 + Cx + D = 0이면 0은 모든 정수의 배수이고 Ax^3 + Bx^2 + Cx는 x의 배수이니까 D는 x의 배수가 됩니다

사실 다른 정답자 분 코드를 보고 왔는데 long double을 써도 풀리는 모양입니다...

tmdghks9574   3년 전

넴 그래서 D 의 약수중에서 x를 찾아서 풀었는데 뭔가 잘못풀었는지 틀렸데서 다른방법을 찾고있엇는데

그냥 내가 잘못풀었던건가...

tmdghks9574   3년 전

미분때려서 극소 극대값으로 근 갯수 판별한다음 a의 부호에 따라서 이분탐색으로 정수해를 찾아볼라고도 하였지만 꼭 정수만 찾아진다는 보장이 없어서 이것도 일단 안하고 있는 상태인데 흐엥

sait2000   3년 전

그러니까 그 x가 근인지 확인할 때 그냥 방정식에 x를 대입하면 안 됩니다. 아마도.double은 정확도가 떨어지고 long long은 오버플로우가 납니다.

그리고 중요한 건데, 그 찾아진 정수근이 중근이 아니란 보장이 없습니다. 그러므로 그 근으로 나머지 이차방정식을 꼭 나눠봐야 합니다.

sait2000   3년 전

미분한다는 발상은 좋은 것 같습니다. 정수가 찾아지는지 안 찾아지는지는 근이 있을 수 있는 범위를 다 나눈 다음 구해진 모든 근을 반올림해서 나오는 정수에 대해 근인지 테스트해보는 방법이 있습니다.

tmdghks9574   3년 전

귀찮으실텐데 많은 답변 감사합니다 다시 해보겠습니다!!!!!

tmdghks9574   3년 전

만약 파이썬으로짜면 약수 때려박아도 오버플로우가 안날테니 통과대나여??

sait2000   3년 전

그럴 수도 있겠네요. 저는 파이선으로도 그냥 오버플로우 안 나는 방법으로 짜서 잘 모르겠어요

댓글을 작성하려면 로그인해야 합니다.