/////// File: Poly.C /////// #include #include "Poly.h" Poly::Poly(const int *p, int n) // p supplies n terms : pol( n > 0 ? new int[*p+2] // initialize pointer pol : new int ) { if ( n == 0 ) *pol = -1; // zero polynomial else s_to_d(pol, p); // converted data in pol } // sparse-to-dense conversion, a private member void Poly::s_to_d(int *buf, const int *p) { int d = *buf++ = *p; // degree while ( d >= 0 ) // conversion loop { if ( d == *p ) { *buf++ = *++p; p++;} // nonzero term else /* ( d > *p ) */ { *buf++ = 0; } // zero term d--; } } Poly Poly::operator+(Poly q) { int *c, *a, *b; Poly ans; // result object int d = deg(), dq = q.deg(); if ( d < dq ) { dq = d; d = q.deg(); b = pol; a = q.pol; // d=deg(a) >= deg(b) } else { a = pol; b = q.pol; } a++; b++; while ( d == dq && d > 0 && *a + *b == 0 ) // leading terms cancel { d--; dq--; a++; b++; } ans.pol = c = new(int[d+2]); // allocate space for result *c++ = d; // degree of result while(d-- > dq) *c++ = *a++; // leading terms while(d-- > -2) *c++ = *a++ + *b++; // add terms return(ans); } void Poly::display() { int *p = pol + 1; int d = deg(), e = d; if ( e == 0 ) { cout << *p << endl; return; } cout << '('; while ( d >= 0 ) { if ( *p != 0 ) { if ( d < e ) cout << ", "; cout << d << " " << *p; } d--; p++; } cout << ")\n"; }