Задача: Даны действительные числа [latex] a,b,c (a\neq 0) [/latex] . Полностью исследовать биквадратное уравнение [latex] ax^4+bx^2+c=0 [/latex] т.е если действительных корней нет, то должно быть выдано сообщение об этом, иначе должны быть выданы два или четыре корня.
Я немного усложнил задачу, добавил случай [latex] a=0 [/latex]
a | b | c | x1 | x2 | x3 | x4 |
0 | 0 | 0 | R | R | R | R |
0 | 0 | 1 | — | — | — | — |
0 | 1 | 0 | 0 | 0 | 0 | 0 |
0 | 2 | -8 | 2 | -2 | — | — |
0 | 2 | 3 | — | — | — | — |
10 | 2 | 10 | — | — | — | — |
2 | 2 | -6 | 1.14 | -1.14 | — | — |
-5 | 22 | -6 | 0.24 | -0.54 | 2.09 | -2.09 |
1 | 4 | 4 | — | — | — | — |
1 | -4 | 4 | 1.41 | -1.41 | — | — |
Решение:
Ссылка на ideone C++: http://ideone.com/By6f3b
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
double a, b, c, x1, x2, x3, x4, t1, t2, d, D; bool log=false; cin>>a; cin>>b; cin>>c; if (a==0) { if (b!=0) { if (c==0) {cout<<"X=0";} else { if (c/b<0){ x1=sqrt(-(c/b)); x2=-sqrt(-(c/b)); cout<<"X1="<<x1<<"; X2="<<x2; } else {cout<<"Нет решений";} } } else { if (c!=0) {cout<<"Нет решений";} else {cout<<"X любое";} } } else{ D = (b * b - 4 * a * c); if (D<0) {cout<<"Нет решений";} else { d=sqrt(D); t1=( - b + d )/2.0 / a; t2=( - b - d )/2.0 / a; if (t1>0){ x1=sqrt(t1); x2=-sqrt(t1); cout<<"X1="<<x1<<"; X2="<<x2<<"; "; log = true; } if (t2>0){ x3=sqrt(t2); x4=-sqrt(t2); if (log == true){cout<<"X3="<<x3<<"; X4="<<x4<<";";} if (log == false){cout<<"X1="<<x3<<"; X2="<<x4<<";";} } } } } |
Ссылка на ideone Java: http://ideone.com/fsmSvf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
import java.util.*; import java.lang.*; import java.io.*; class Ideone { public static void main (String[] args) throws java.lang.Exception { Scanner in = new Scanner(System.in); double a, b, c, x1, x2, x3, x4, t1, t2, d, D; boolean log=false; a=in.nextDouble(); b=in.nextDouble(); c=in.nextDouble(); if (a==0) { if (b!=0) { if (c==0) {System.out.printf("X=0;");} else { if (c/b<0){ x1=Math.sqrt(-(c/b)); x2=-Math.sqrt(-(c/b)); System.out.printf("X1=%f; X2=%f; ",x1,x2); } else {System.out.printf("Нет решений");} } } else { if (c!=0) {System.out.printf("Нет решений");} else {System.out.printf("X любое");} } } else{ D = (b * b - 4 * a * c); if (D<0) {System.out.printf("Нет решений");} else { d=Math.sqrt(D); t1=( - b + d )/2.0 / a; t2=( - b - d )/2.0 / a; if (t1>0){ x1=Math.sqrt(t1); x2=-Math.sqrt(t1); System.out.printf("X1=%f; X2=%f; ",x1,x2); log = true; } if (t2>0){ x3=Math.sqrt(t2); x4=-Math.sqrt(t2); if (log == true){System.out.printf("X3=%f; X4=%f; ",x3,x4);} if (log == false){System.out.printf("X1=%f; X2=%f; ",x3,x4);} } } } } } |
Если [latex] a\neq 0 [/latex] , то надо рассмотреть только несколько случаев: Дискриминант меньше нуля (корней нет), дискриминант больше нуля, тогда делаем замену, [latex] x^2=t>0 [/latex] и считаем [latex] t [/latex], далее проверяем будет ли [latex] t>0 [/latex]
Если добавить случай с [latex] a=0 [/latex] , то надо рассмотреть ситуации:
[latex] b=0 [/latex] , тогда если [latex] c=0 [/latex] , то корней бесконечно много, в противном случае — корней нет. [latex] b\neq 0 [/latex] , тогда если [latex] -(c/b)>0 [/latex] , то решение есть, в противном случае под корнем отрицательное число
if (log == true) можно упростить до if (log)
а следующий if (log == false) вообще лучше заменить на else
юольше — опечатка
«Дискриминант меньше нуля (корней нет), дискриминант юольше нуля, …» — а равен нулю он не может быть? кстати подобный тест желательно привести. Как отработает Ваша программа — верно или нет?
см. что б — а вообще этот фрагмент лучше переписать в более формальной и подробной манере (если t>0, то … иначе)
надо рассмотреть ситуации b=0, … — ну и как они рассмотрены? т.е. по программе видно, что да, а в отчете?
Все исправил.
Если дискриминант равен нулю, то программа работает нормально.
Добавил в отчет ситуации с b=0.
Засчитано, 8 баллов (т.к. дата публикации позже 5 октября).
Программа работает как раз хорошо — в отчете небольшая неточность «Дискриминант меньше нуля (корней нет), дискриминант больше нуля, тогда делаем замену» — в случае дискриминант = 0, тоже ведь делаем замену, значит должно быть
«Дискриминант меньше нуля (корней нет), дискриминант больше либо равен нулю, тогда делаем замену»
И если уж совсем придираться к оформлению, то «Если добавить случай с a=0 , то надо рассмотреть ситуации:» и далее должен быть список например:
1) ….
2) ….
или
а) …
б) …
А программа качественно написана, молодец!
Куда-то исчезло начало и конец кода на С++.
Ну я же сразу написал: if (log == true) можно упростить до if (log)
а следующий if (log == false) вообще лучше заменить на else!
Java версии тоже это касается. Сразу заметна эта стилевая недоработка.
Я уж не говорю, что log можно было бы назвать иначе.