Post List

[Fundamentals of Data Structures in c++] 두 다항식의 곱셈 구현



C++로 구현한 두 다항식 간의 곱셈 연산



1. Polynomial의 구조:


// Term 구조체 선언
struct Term {
 friend Polynomial;
 float coef;
 int exp;
};

// Polynomial 클래스 선언
class Polynomial {
private:
 Term * termArray;
 int capacity;
 int terms;  // 클래스에 현재 저장되어 있는 항의 개수를 나타냄.
public :
 Polynomial();
 Polynomial operator*(Polynomial* b);
        
     // NewTerm 함수로 Polynomial에 Term을 연결한다.
 void NewTerm(const float theCoef, const int theExp);
};


2. 곱하기 연산 개요

2-1. 각 항을 순회하며 항의 곱셈 연산을 실시합니다..
2-2. 최고차항부터 같은 지수를 가지는 항들의 계수를 모두 더한 후,  새로 저장합니다.


소스코드 :


Polynomial Polynomial::operator*(Polynomial& b) {
 Polynomial c; // 최종 곱셈 결과를 저장할 다항식 클래스 tmp 선언.
 Polynomial tmp; // 임시 곱셈 결과를 저장할 다항식 클래스 tmp 선언.

     // 각 term 간의 곱셈 연산을 tmp의 termArray에 저장.
 for (int i = 0; i < terms; i++) {
  for (int j = 0; j < b.terms; j++) {
   float new_coef = termArray[i].coef * b.termArray[j].coef;
   int new_exp = termArray[i].exp + b.termArray[j].exp;
   tmp.NewTerm(new_coef, new_exp);
  }
 }

 // for문으로 최고차항에서 내림차순으로, 같은 지수면 전부 합한 후 c의 termArray에 저장.
 int big = tmp.termArray[0].exp;
 c.NewTerm(tmp.termArray[0].coef, tmp.termArray[0].exp);

 int newbig, sumOfCoef;
 for (int i = 0; i < tmp.terms; i++) {

  // big > tmp.termArray[q] > newbig 을 만족하는 다음으로 큰 지수(newbig)을 탐색.
  newbig = 0;
  for (int q = 1; q < tmp.terms; q++) {
   if (tmp.termArray[q].exp < big & & tmp.termArray[q].exp > newbig)
    newbig = tmp.termArray[q].exp;
  }
  sumOfCoef = 0;

  // newbig과 같은 exp를 가지는 항들을 모두 더함. 
  for (int q = 0; q < tmp.terms; q++) {
   if (tmp.termArray[q].exp == newbig) sumOfCoef += tmp.termArray[q].coef;
  }

  // 합한 결과를 c에 저장.
  c.NewTerm(sumOfCoef, newbig);
  big = newbig;

  // 지수가 0일 경우 한번만 저장한 후 더이상 돌지 않도록 break.
  if (big == 0) break;
 }
 return c;
}



이상으로 두 다항식의 곱셈 구현 포스팅을 마치겠습니다.

댓글