#include #include typedef struct {double re,im;} complexe; complexe c_add(complexe a,complexe b) { return (complexe){a.re+b.re,a.im+b.im}; } complexe c_sub(complexe a,complexe b) { return (complexe){a.re-b.re,a.im-b.im}; } complexe c_mul(complexe a,complexe b) { return (complexe){a.re*b.re-a.im*b.im, a.re*b.im+a.im*b.re}; } complexe c_div(complexe a,complexe b) { double n=b.re*b.re+b.im*b.im; // n=|b|² return (complexe){(a.re*b.re+a.im*b.im)/n, // a/b=b*conj(b)/|b|² (a.im*b.re-a.re*b.im)/n}; } complexe c_sqrt(complexe a) { double n=sqrt(a.re*a.re+a.im*a.im), x=0, y=0; if(n) // si a est nul les calculs suivants donnent 0/0 { if(a.re>0) x=sqrt((n+a.re)/2), y=a.im/(2*x); // |x|>|y| else y=sqrt((n-a.re)/2), x=a.im/(2*y); // |y|>=|x| } return (complexe){x,y}; } void c_aff(complexe a) { printf("(%lf+%lfi)",a.re,a.im); } complexe c_lire() { complexe a; scanf("%lf%lf",&a.re,&a.im); return a; } void c_eq2(complexe a,complexe b,complexe c,complexe *x1,complexe *x2) // a x²+bx+c=0 { complexe d; b.re/=-2, b.im/=-2; // l'équation devient a x²-2bx+c=0 donc x=(b+sqrt(b²-ac)=/a d=c_sqrt(c_sub(c_mul(b,b),c_mul(a,c))); // d=sqrt(b²-ac) *x1=c_div((b.re*d.re+b.im*d.im>0?c_add:c_sub)(b,d),a); // *x1=(b+d)/a ou (b-d)/a mais |*x1|>=|*x2| *x2=x1->re || x1->im ? c_div(c,c_mul(a,*x1)) : *x1; // *x2=c/(a* *x1) si *x1 est non nul } int main() { complexe a=c_lire(), b=c_lire(), c=c_lire(), x1, x2; c_aff(a), printf("+"), c_aff(b), printf("="), c_aff(c_add(a,b)), printf("\n"); c_aff(a), printf("-"), c_aff(b), printf("="), c_aff(c_sub(a,b)), printf("\n"); c_aff(a), printf("*"), c_aff(b), printf("="), c_aff(c_mul(a,b)), printf("\n"); c_aff(a), printf("/"), c_aff(b), printf("="), c_aff(c_div(a,b)), printf("\n"); printf("sqrt"), c_aff(a), printf("="), c_aff(c_sqrt(a )), printf("\n"); c_eq2(a,b,c,&x1,&x2); printf("Les deux racines de l'équation "), c_aff(a), printf("X²+"), c_aff(b), printf("X+"), c_aff(c), printf("=0 sont "); c_aff(x1), printf(" et "), c_aff(x2); return 0; }