#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<time.h>
double GenerateInitialGuess( int ) ; double FindOneRealRoot( double , double , double , double , double ) ;
void ReducePolynomial( double , double , double , double , double , double *, double *, double * ) ;
int SolveQuadraticEquation( double , double , double , double *, double *, double *, double * ) ;
main( void ) {
int n, root;
double a, b, c, d, guess, m, x1r, x1i, x2r, x2i;
char yn;
do {
printf ( "Input Cubic Equation like that form :\n 3x^3 + x^2 -2.5x + 2.4 = 0 ->3 1 -2.5 2.4\n 2x^2 - 1 = 0 -> 0 2 0 -1\n " ) ; scanf ( "%lf %lf %lf %lf%*c" , & a
, & b
, & c
, & d
) ; if ( a) {
do {
printf ( "Type positive integer to guess real root\n " ) ; if ( n> 0 )
break ; } while ( 1 ) ;
guess= GenerateInitialGuess( n) ;
printf ( "Set x0 as %lf between %d and %d\n " , guess
, n
, - n
) ; printf ( "Try to solve %lfx^3 %+lfx^2 %+lfx %+lf = 0\n " , a
, b
, c
, d
) ; m= FindOneRealRoot( a, b, c, d, guess) ;
printf ( "From x0 as %lf. %lf is founded as m.\n " , guess
, m
) ; ReducePolynomial( a, b, c, d, m, & b,& c,& d) ;
printf ( "Reduced Equation using (x%+lf), We got %lfx^2 %+lfx %+lf = 0\n " , - m
, b
, c
, d
) ; } else
printf ( "Because a=0, " ) ; /* When a=0, just deal with like quadratic */ printf ( "Now Try to solve %lfx^2 %+lfx %+lf = 0\n " , b
, c
, d
) ; root= SolveQuadraticEquation( b, c, d, & x1r,& x1i,& x2r,& x2i) ;
switch ( root) {
case - 1 : printf ( "Any numbers in complex are root.\n " ) ; break ; /* case -1 and 0 occur when a=0 */ case 0 : printf ( "There are no roots in complex number.\n " ) ; break ; case 1 : if ( a) { /* when a!=0, Reduced polynomial p!=0 so case 1 mean double root */
if ( m
== x1r
) printf ( "Because Double Root from Quadratic is same as m, there is only one triple root\n x = %lf\n " , m
) ; /* for (x-m)^3 */ else printf ( "There are two roots for Cubic,\n one is x = %lf\n other is x = %lf\n and latter was doble root from Quadratic.\n " , m
, x1r
) ; } /* for (x-m)(x-x1r)^2 */ else if ( b
) printf ( "You input Quadratic equation, and there is only one double root.\n x = %lf\n " , x1r
) ; /* a=0 b!=0 -> (x-x1r)^2 */ else printf ( "Because input eqaution is linear, there is only one root.\n x = %lf\n " , x1r
) ; break ; case 2 : if ( a) { /* when a!=0 -> m exsist*/
if ( x1i
) printf ( "There is one real root,\n x = %lf\n and two complex roots\n x = %lf %+lfi and x = %lf %+lfi\n " , m
, x1r
, x1i
, x2r
, x2i
) ; else if ( m
== x1r
) printf ( "Because one root from quadratic is same as m, there are two roots.\n one is x = %lf\n other is x = %lf and latter was doble root.\n " , x2r
, x1r
) ; else if ( m
== x2r
) printf ( "Because one root from quadratic is same as m, there are two roots.\n one is x = %lf\n other is x = %lf and latter was doble root.\n " , x1r
, x2r
) ; else printf ( "There are three real roots,\n x = %lf\n x = %lf and\n x = %lf\n " , m
, x1r
, x2r
) ; } else /* a=0 -> Quadratic*/
if ( x1i
) printf ( "There are two complex roots\n x = %lf %+lfi and x = %lf %+lfi\n " , x1r
, x1i
, x2r
, x2i
) ; else printf ( "There are two real roots,\n x = %lf and\n x = %lf\n " , x1r
, x2r
) ; break ; }
printf ( "Check with another Equation?\n " ) ; if ( yn== 'n' || yn== 'N' )
break ;
} while ( 1 ) ; /*20145030 KST GIST*/
return 0 ; } /* I bebug it using http://i...content-available-to-author-only...e.com/ / http://i...content-available-to-author-only...e.com/e.js/9ioZ0U is temp address for my code*/
double GenerateInitialGuess( int n) {
double guess
= rand ( ) % ( 2 * n
+ 1 ) - n
; return guess; }
double FindOneRealRoot( double a, double b, double c, double d, double guess) {
double acc, x = guess;
do {
while ( 3 * a
* pow ( x
, 2 ) + 2 * b
* x
+ c
== 0.0 ) { /* Try to avoid divide by zero, it will work? I just hope. */ if ( a
* pow ( x
, 3 ) + b
* pow ( x
, 2 ) + c
* x
+ d
== 0.0 ) { x/= 10000 ;
/* Because acc not enough when (x-m)^3=0, round up */
return x; }
x++; }
acc
= ( a
* pow ( x
, 3 ) + b
* pow ( x
, 2 ) + c
* x
+ d
) / ( 3 * a
* pow ( x
, 2 ) + 2 * b
* x
+ c
) ; /* adujust version of Newton's methord */ if ( fabs ( acc
) <= 0.0000000001 ) break ;
x-= acc; } while ( 1 ) ;
x/= 10000 ;
return x; }
void ReducePolynomial( double a, double b, double c, double d, double m, double * p, double * q, double * r) {
* p= a; * q= b+ m* ( * p) ; * r= c+ m* ( * q) ; } /* Using Synthetic division */
int SolveQuadraticEquation( double p, double q, double r, double * x1r, double * x1i, double * x2r, double * x2i) {
int root; /* -1 for infinity roots */
if ( p) {
if ( D> 0.0 ) { /* two real */
* x1i=* x2i= 0 ;
root= 2 ;
} else if ( D< 0.0 ) { /* two complex */
* x1r=* x2r=- q/ ( 2 * p) ;
root= 2 ;
} else { /* double root */
* x1r=- q/ ( 2 * p) ;
root= 1 ; }
} else if ( q) { /* linear */
* x1r=- r/ q;
root= 1 ;
} else if ( r)
root= 0 ;
else
root=- 1 ;
return root; }
I2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8bWF0aC5oPgojaW5jbHVkZTxzdGRsaWIuaD4KI2luY2x1ZGU8dGltZS5oPgpkb3VibGUgR2VuZXJhdGVJbml0aWFsR3Vlc3MoaW50KTsgZG91YmxlIEZpbmRPbmVSZWFsUm9vdChkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSk7CnZvaWQgUmVkdWNlUG9seW5vbWlhbChkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlICosZG91YmxlICosZG91YmxlICopOwppbnQgU29sdmVRdWFkcmF0aWNFcXVhdGlvbihkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUgKixkb3VibGUgKixkb3VibGUgKixkb3VibGUgKik7Cm1haW4odm9pZCl7CiAgaW50IG4scm9vdDsKICBkb3VibGUgYSwgYiwgYywgZCwgZ3Vlc3MsIG0sIHgxciwgeDFpLCB4MnIsIHgyaTsKICBjaGFyIHluOwpkb3sKcHJpbnRmKCJJbnB1dCBDdWJpYyBFcXVhdGlvbiBsaWtlIHRoYXQgZm9ybSA6XG4gM3heMyArIHheMiAtMi41eCArIDIuNCA9IDAgLT4zIDEgLTIuNSAyLjRcbiAyeF4yIC0gMSA9IDAgLT4gMCAyIDAgLTFcbiIpOwpzY2FuZigiJWxmICVsZiAlbGYgJWxmJSpjIiwgJmEsICZiLCAmYywgJmQpOwppZihhKXsKCWRvewoJcHJpbnRmKCJUeXBlIHBvc2l0aXZlIGludGVnZXIgdG8gZ3Vlc3MgcmVhbCByb290XG4iKTsKCXNjYW5mKCIlZCUqYyIsICZuKTsKCWlmKG4+MCkKCWJyZWFrO313aGlsZSgxKTsKZ3Vlc3M9R2VuZXJhdGVJbml0aWFsR3Vlc3Mobik7CnByaW50ZigiU2V0IHgwIGFzICVsZiBiZXR3ZWVuICVkIGFuZCAlZFxuIiwgZ3Vlc3MsIG4sIC1uKTsKcHJpbnRmKCJUcnkgdG8gc29sdmUgJWxmeF4zICUrbGZ4XjIgJStsZnggJStsZiA9IDBcbiIsYSxiLGMsZCk7Cm09RmluZE9uZVJlYWxSb290KGEsIGIsIGMsIGQsIGd1ZXNzKTsKcHJpbnRmKCJGcm9tIHgwIGFzICVsZi4gJWxmIGlzIGZvdW5kZWQgYXMgbS5cbiIsIGd1ZXNzLCBtKTsgClJlZHVjZVBvbHlub21pYWwoYSwgYiwgYywgZCwgbSwgJmIsJmMsJmQpOwpwcmludGYoIlJlZHVjZWQgRXF1YXRpb24gdXNpbmcgKHglK2xmKSwgV2UgZ290ICVsZnheMiAlK2xmeCAlK2xmID0gMFxuIiwgLW0sIGIsIGMsIGQpO30KZWxzZQpwcmludGYoIkJlY2F1c2UgYT0wLCAiKTsgLyogV2hlbiBhPTAsIGp1c3QgZGVhbCB3aXRoIGxpa2UgcXVhZHJhdGljICovCnByaW50ZigiTm93IFRyeSB0byBzb2x2ZSAlbGZ4XjIgJStsZnggJStsZiA9IDBcbiIsIGIsIGMsIGQpOwpyb290PVNvbHZlUXVhZHJhdGljRXF1YXRpb24oYiwgYywgZCwgJngxciwmeDFpLCZ4MnIsJngyaSk7CnN3aXRjaChyb290KXsKY2FzZSAtMSA6IHByaW50ZigiQW55IG51bWJlcnMgaW4gY29tcGxleCBhcmUgcm9vdC5cbiIpOyBicmVhazsgLyogY2FzZSAtMSBhbmQgMCBvY2N1ciB3aGVuIGE9MCAqLwpjYXNlIDAgOiBwcmludGYoIlRoZXJlIGFyZSBubyByb290cyBpbiBjb21wbGV4IG51bWJlci5cbiIpOyBicmVhazsKY2FzZSAxIDogaWYoYSl7IC8qIHdoZW4gYSE9MCwgUmVkdWNlZCBwb2x5bm9taWFsIHAhPTAgc28gY2FzZSAxIG1lYW4gZG91YmxlIHJvb3QgKi8KaWYobT09eDFyKSBwcmludGYoIkJlY2F1c2UgRG91YmxlIFJvb3QgZnJvbSBRdWFkcmF0aWMgaXMgc2FtZSBhcyBtLCB0aGVyZSBpcyBvbmx5IG9uZSB0cmlwbGUgcm9vdFxuIHggPSAlbGZcbiIsIG0pOyAvKiBmb3IgKHgtbSleMyAqLwplbHNlIHByaW50ZigiVGhlcmUgYXJlIHR3byByb290cyBmb3IgQ3ViaWMsXG4gb25lIGlzIHggPSAlbGZcbiBvdGhlciBpcyB4ID0gJWxmXG4gYW5kIGxhdHRlciB3YXMgZG9ibGUgcm9vdCBmcm9tIFF1YWRyYXRpYy5cbiIsIG0sIHgxcik7fSAvKiBmb3IgKHgtbSkoeC14MXIpXjIgKi8KZWxzZSBpZihiKSBwcmludGYoIllvdSBpbnB1dCBRdWFkcmF0aWMgZXF1YXRpb24sIGFuZCB0aGVyZSBpcyBvbmx5IG9uZSBkb3VibGUgcm9vdC5cbiB4ID0gJWxmXG4iLCB4MXIpOyAvKiBhPTAgYiE9MCAtPiAoeC14MXIpXjIgKi8KZWxzZSBwcmludGYoIkJlY2F1c2UgaW5wdXQgZXFhdXRpb24gaXMgbGluZWFyLCB0aGVyZSBpcyBvbmx5IG9uZSByb290LlxuIHggPSAlbGZcbiIsIHgxcik7IGJyZWFrOwpjYXNlIDIgOiBpZihhKXsgLyogd2hlbiBhIT0wIC0+IG0gZXhzaXN0Ki8KaWYoeDFpKSBwcmludGYoIlRoZXJlIGlzIG9uZSByZWFsIHJvb3QsXG4geCA9ICVsZlxuIGFuZCB0d28gY29tcGxleCByb290c1xuIHggPSAlbGYgJStsZmkgYW5kIHggPSAlbGYgJStsZmlcbiIsbSAseDFyLHgxaSx4MnIseDJpKTsKZWxzZSBpZihtPT14MXIpIHByaW50ZigiQmVjYXVzZSBvbmUgcm9vdCBmcm9tIHF1YWRyYXRpYyBpcyBzYW1lIGFzIG0sIHRoZXJlIGFyZSB0d28gcm9vdHMuXG4gb25lIGlzIHggPSAlbGZcbiBvdGhlciBpcyB4ID0gJWxmIGFuZCBsYXR0ZXIgd2FzIGRvYmxlIHJvb3QuXG4iLHgycix4MXIpOwplbHNlIGlmKG09PXgycikgcHJpbnRmKCJCZWNhdXNlIG9uZSByb290IGZyb20gcXVhZHJhdGljIGlzIHNhbWUgYXMgbSwgdGhlcmUgYXJlIHR3byByb290cy5cbiBvbmUgaXMgeCA9ICVsZlxuIG90aGVyIGlzIHggPSAlbGYgYW5kIGxhdHRlciB3YXMgZG9ibGUgcm9vdC5cbiIseDFyLHgycik7CmVsc2UgcHJpbnRmKCJUaGVyZSBhcmUgdGhyZWUgcmVhbCByb290cyxcbiB4ID0gJWxmXG4geCA9ICVsZiBhbmRcbiB4ID0gJWxmXG4iLG0seDFyLHgycik7fQplbHNlIC8qIGE9MCAtPiBRdWFkcmF0aWMqLwppZih4MWkpIHByaW50ZigiVGhlcmUgYXJlIHR3byBjb21wbGV4IHJvb3RzXG4geCA9ICVsZiAlK2xmaSBhbmQgeCA9ICVsZiAlK2xmaVxuIix4MXIseDFpLHgycix4MmkpOwplbHNlIHByaW50ZigiVGhlcmUgYXJlIHR3byByZWFsIHJvb3RzLFxuIHggPSAlbGYgYW5kXG4geCA9ICVsZlxuIix4MXIseDJyKTsKYnJlYWs7fQpwcmludGYoIkNoZWNrIHdpdGggYW5vdGhlciBFcXVhdGlvbj9cbiIpOwpzY2FuZigiJWMlKmMiLCAmeW4pOwppZiAoeW49PSduJ3x8eW49PSdOJykKCWJyZWFrOwogIH13aGlsZSgxKTsgLyoyMDE0NTAzMCBLU1QgR0lTVCovCiAgcmV0dXJuIDA7fSAvKiBJIGJlYnVnIGl0IHVzaW5nIGh0dHA6Ly9pLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5lLmNvbS8gLyBodHRwOi8vaS4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uZS5jb20vZS5qcy85aW9aMFUgaXMgdGVtcCBhZGRyZXNzIGZvciBteSBjb2RlKi8KZG91YmxlIEdlbmVyYXRlSW5pdGlhbEd1ZXNzKGludCBuKXsKc3JhbmQodGltZShOVUxMKSk7CmRvdWJsZSBndWVzcz1yYW5kKCklKDIqbisxKSAtIG47CnJldHVybiBndWVzczt9CmRvdWJsZSBGaW5kT25lUmVhbFJvb3QoZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgYywgZG91YmxlIGQsIGRvdWJsZSBndWVzcyl7CiAgZG91YmxlIGFjYywgeCA9IGd1ZXNzOwogIGRvewoJd2hpbGUgKDMqYSpwb3coeCwyKSsyKmIqeCtjPT0wLjApeyAvKiBUcnkgdG8gYXZvaWQgZGl2aWRlIGJ5IHplcm8sIGl0IHdpbGwgd29yaz8gSSBqdXN0IGhvcGUuICovCglpZihhKnBvdyh4LDMpK2IqcG93KHgsMikrYyp4K2Q9PTAuMCl7Cgl4PWZsb29yKHgqMTAwMDArMC41KTsKCXgvPTEwMDAwOwoJLyogQmVjYXVzZSBhY2Mgbm90IGVub3VnaCB3aGVuICh4LW0pXjM9MCwgcm91bmQgdXAgKi8KCXJldHVybiB4O30KCSB4Kys7fSAKCWFjYz0oYSpwb3coeCwzKStiKnBvdyh4LDIpK2MqeCtkKS8oMyphKnBvdyh4LDIpKzIqYip4K2MpOyAvKiBhZHVqdXN0IHZlcnNpb24gb2YgTmV3dG9uJ3MgbWV0aG9yZCAqLwoJaWYoZmFicyhhY2MpPD0wLjAwMDAwMDAwMDEpCgkgIGJyZWFrOwoJeC09YWNjO313aGlsZSgxKTsKCXg9Zmxvb3IoeCoxMDAwMCswLjUpOwoJeC89MTAwMDA7CglyZXR1cm4geDt9CnZvaWQgUmVkdWNlUG9seW5vbWlhbChkb3VibGUgYSxkb3VibGUgYixkb3VibGUgYyxkb3VibGUgZCxkb3VibGUgbSwgZG91YmxlKnAsZG91YmxlKnEsZG91YmxlKnIpewoqcD1hOyAqcT1iK20qKCpwKTsgKnI9YyttKigqcSk7fSAvKiBVc2luZyBTeW50aGV0aWMgZGl2aXNpb24gKi8KaW50IFNvbHZlUXVhZHJhdGljRXF1YXRpb24oZG91YmxlIHAsIGRvdWJsZSBxLCBkb3VibGUgciwgZG91YmxlICp4MXIsZG91YmxlICp4MWksZG91YmxlICp4MnIsZG91YmxlICp4MmkpewppbnQgcm9vdDsgLyogLTEgZm9yIGluZmluaXR5IHJvb3RzICovCmlmKHApewpkb3VibGUgRD1wb3cocSwyKS00KnAqcjsKCWlmKEQ+MC4wKXsgLyogdHdvIHJlYWwgKi8KCSp4MXI9KC1xK3NxcnQoRCkpLzIqcDsKCSp4MnI9KC1xLXNxcnQoRCkpLzIqcDsKCSp4MWk9KngyaT0wOwoJcm9vdD0yOwoJfWVsc2UgaWYoRDwwLjApeyAvKiB0d28gY29tcGxleCAqLwoJKngxcj0qeDJyPS1xLygyKnApOwoJKngxaT1zcXJ0KC1EKS8oMipwKTsKCSp4Mmk9LXNxcnQoLUQpLygyKnApOwoJcm9vdD0yOwoJfWVsc2V7IC8qIGRvdWJsZSByb290ICovCgkqeDFyPS1xLygyKnApOwoJcm9vdD0xO30KfWVsc2UgaWYocSl7IC8qIGxpbmVhciAqLwoqeDFyPS1yL3E7CnJvb3Q9MTsKfWVsc2UgaWYocikKcm9vdD0wOwplbHNlCnJvb3Q9LTE7CnJldHVybiByb290O30=