(2)mult (3)trim구현이 엄청 어려워서 은근히 시간을 많이 소요했다...
#include <iostream>
#include <iomanip>
using namespace std;
#define MAX_DEGREE 80 //다항식의 처리 가능한 최대차수+1
class Polynomial {
int degree; //다항식의 최고 차수
float coef[MAX_DEGREE]; //각 항에 대한 계수
public:
Polynomial() { degree = 0; }//생성자
void read() { //차수, 계수 읽기
cout << "다항식의 최고 차수를 입력하세요:";
cin >> degree;
cout << "각 항의 계수를 입력하세요(총 " << degree + 1 << "개):";
for (int i = 0; i <= degree; i++)
cin >> coef[i];//계수 배열의 각 계수들 입력
}
void display(const char* str = " Poly = ") {
cout << "\t" << str;
for (int i = 0; i < degree; i++) {
if (coef[i] == 1)
cout << " x^" << degree - i << "+ ";
else if (coef[i]!=0) {
cout << fixed << setprecision(1) << coef[i] << " x^" << degree - i << "+ ";
}
}
cout << coef[degree] << endl;
}
void add(Polynomial a, Polynomial b) { //c=a+b(덧셈 함수)
if (a.degree > b.degree) { //a>b항
*this = a;//a다항식을 자기 객체에 복사(c=a+b일때 c=a;연산하는 부분임)
for (int i = 0; i <=b.degree; i++)
coef[i + (degree - b.degree)] += b.coef[i];//다항식 계수를 순서대로 자신의 계수배열에 맞는 차수끼리 더함
}
else { //b>a항
*this = b;
for (int i = 0; i <= a.degree; i++)
coef[i + (degree - a.degree)] += a.coef[i];
}
trim();
}
void sub(Polynomial a, Polynomial b) {//c=a-b(뺄셈)
if (a.degree > b.degree) {
*this = a;
for (int i = 0; i <=b.degree; i++) {
coef[i + (degree - b.degree)] -= b.coef[i];
}
}
else { //b항이 a항보다 차수가 큰 경우
*this = b;
for (int i = 0; i <= a.degree; i++) {
coef[i + (degree - a.degree)] -= a.coef[i];
}
}
trim();
}
void mult(Polynomial a, Polynomial b) {//c=a*b(곱셈)
*this = a;
int temp = degree;//temp에 원래 차수 저장
degree += b.degree;//a와 b객체의 차수 더하기(2제곱 *3제곱=5제곱이니까)
int arr[MAX_DEGREE];//임의의 차수 정보 보관할 배열 선언
for (int i = 0; i <= degree; i++)
arr[i] = 0;//배열의 모든 차수들의 항을 초기화
if (temp < b.degree) { //기존 다항식의 최고차수<b객체의 차수
for (int i = 0; i <= temp; i++) {
coef[i + b.degree] = coef[i];
coef[i] = 0;
}
}
else if (temp == b.degree) { //기존 다항식의 최고차수=b객체의 차수
for (int i = 0; i <= temp; i++) {
coef[i + temp] = coef[i];
if (i != temp)
coef[i] = 0;
}
}
else { //기존 다항식의 최고차수>b객체의 차수
for (int i = 0; i <= temp; i++)
arr[i] = coef[i];
for (int i = 0; i <= temp; i++) {
coef[i + b.degree] = arr[i];
if (i < b.degree)
coef[i] = 0;
}
for (int i = 0; i <= degree; i++) {
arr[i] = 0;
}
}
for (int i = 0; i <= temp; i++) { //arr임의 배열에 정보 담기
for (int j = 0; j <= b.degree; j++) {
arr[i + j] += coef[b.degree + i] * b.coef[j];
}
}
for (int i = 0; i <= temp; i++) {
for (int j = 0; j <= b.degree; j++) {
coef[i + j] = arr[i + j];//arr임의 배열 정보들을 coef배열로 옮기기
}
}
trim();
}
bool iszero() { return degree == 0; }//if 최고차수가 0일때 차수=0반환
void negate() { //계수 부호를 반대로
for (int i = 0; i <= degree; i++)
coef[i] =-coef[i];//계수 부호 바꾸기
}
void trim() { //최고차수가 0이 아닌 값 나오게 다항식의 속성값 변경
int count = 0;
while (!coef[count]) //최고차수 0 아닐때까지 반복
count++;
if (count) {//최고차수 0이 아니라면 실행 X
int temp = degree; //기존 차수 저장
degree -= count; //최고차수 감소시킨다
for (int i = 0; i <= temp - count; i++) //자리를 shift
coef[i] = coef[i + count];
}
}
};
int main(void) {
Polynomial a, b, c;
a.read();
b.read();
c.add(a, b); //c=a+b;
a.display("A=");
b.display("B=");
c.display("A+B=");
c.sub(a, b); //c=a-b;
c.display("A-B=");
c.mult(a, b); //c=a*b;
c.display("A*B=");
}
'data structure practice' 카테고리의 다른 글
과제5-chapter5_연습문제풀이 (0) | 2023.04.01 |
---|---|
과제4-스택, 큐, 덱... (0) | 2023.03.24 |
과제 3 . Postfix 계산 예제 (0) | 2023.03.19 |
백준 연습문제 2562,2577...풀이 (0) | 2023.03.07 |
백준 연습문제들 first hw (0) | 2023.03.05 |