ㅇ 공부#언어/(C++) 자료구조 및 STL

4. 순차(선형)리스트를 이용하여 다항식 계산기 만들기

BrainKimDu 2022. 9. 15. 22:52

(해당 글은 공부를 위해 작성하는 것입니다.)

4.

다항식 계산기를 완성하세요.

다항식의 덧셈, 곱셈, ax^z 를 연산을 수행하는 계산기를 만드세요.

 

모두 구현하세요.

1차원 배열로 구현한 후

2차원 배열로 구현하세요.


알고리즘을 생각하지 전에

1차원배열로 다항식을 어떻게 표현할지 생각을해보자.

 

 

x^4 + 2x^2 + x + 3 

 어떻게 저장을 해야할지 고민이다.

 

5개짜리 배열을 선언한 후

3 2 1 0
1 0 2 1 3

해당 방법으로 표현하는 방법이 가장 좋을 것이다.

 

그렇다면 계산기처럼 입력을 받는 상황이라 가정할 때

다항식으로 바로 입력을 받는건 조금 무리가 있다고 생각하고, 거기보다 난이도를 낮춰서

두 가지 접근 방식을 생각해보자.

1. 처음부터 최고 지수를 입력받아 동적배열을 생성하고 반복문을 통해 -1씩 계수를 받아내는 방법
2. 계수와 지수를 입력받고, 최고차항부터 입력을 받아 최고차항으로 동적배열을 생성하고 반복문과 if문을 통해 저장하는 방법 (exit를 통해 무한루프를 탈출)

 

1번의 경우 x^1000 + 1 을 저장할 때 998번 0을 입력해야한다.

2번의 경우 1과 같은 문제는 없지만 반복문을 2번 조건문을 최고차항의 개수만큼 돌아야한다.

 

생각을 했는데, 1과 2를 합칠 수 있었다.

최고차항을 입력받고, 입력을 할 때 계수와 지수를 입력받으면된다.

 

 

사용자로부터 다항식을 입력받는 추상자료형을 작성해보자.

ADT 다항식입력{
    int 계수, 지수;
    int 최고차항;
	

    출력 ("최고차항의 지수를 입력해주세요");
    입력 (최고차항);
    
    int *다항식 = (int *)malloc(sizeof(int) * 최고차항)
    다항식의 모든 원소를 0으로 초기화하자.
    
    bool 무한루프탈출 = true
    
    while(무한루프탈출){
    
    	출력 ("지수를 입력하세요")
        입력 (지수)
        출력 ("계수를 입력하세요")
        입력 (계수)    
        다항식[지수] = 계수;
        
        출력("계속입력하시겠습니까?  1 : 계속 , 0 : 탈출")
        입력 (무한루프탈출);
   
    }
   
   for(int i=0; i<최고차항; i++){
   		if( 다항식[i] != 0)
        	출력(계수 << "x^" << 지수 << " ");
   }
}

 

 

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<malloc.h>


int main() {
    int co, exp;
    int MAX;


    printf("최고차항의 지수를 입력해주세요");
    scanf("%d", &MAX);

    int* poly = (int*)malloc(sizeof(int) * (MAX+1));
    for (int i = 0; i <= MAX; i++) {
        poly[i] = 0;
    }
    
    int sel = 1;

    while (sel == 1) {

        printf("지수와 계수를 입력하세요");
        scanf("%d %d", &exp, &co);
        poly[exp] = co;

        printf("계속입력하시겠습니까?  1 : 계속 , 0 : 탈출");
        scanf("%d", &sel);

    }

   for (int i = MAX; i >= 0; i--) {
       if (i != 0) {
           if (poly[i] != 0)
               printf(" %dx^%d + ", poly[i], i);
       }
       else {
           if (poly[i] != 0)
               printf("%d ", poly[i]);
       }
   }

   free (poly);
}

한가지 문제가 있다. 0차항이 없다면 +가 출력된다.

머리를 쓰려했으나 갈길이 멀어 수정하지 않고 진행하려한다.

 

일단 사용자로부터 다항식을 입력받아 출력하는 예제는 만들었다.

 

 

두 개의 다항식을 받아오자.

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<malloc.h>


int main() {
    int* A = 0;
    int AMAX = 0;

    int* B = 0;
    int BMAX = 0; 

    int co, exp;
    int sel1 = 1;
    int sel2 = 1;

    printf("A 다항식을 입력합니다. \n");
    printf("최고차항의 지수를 입력해주세요");
    scanf("%d", &AMAX);
    
    A = (int*)malloc(sizeof(int) * (AMAX + 1));
    for (int i = 0; i <= AMAX; i++) {
        A[i] = 0;
    }

    while (sel1 == 1) {

        printf("지수와 계수를 입력하세요");
        scanf("%d %d", &exp, &co);
        A[exp] = co;

        printf("계속입력하시겠습니까?  1 : 계속 , 0 : 탈출");
        scanf("%d", &sel1);

    }


    printf("B 다항식을 입력합니다. \n");
    printf("최고차항의 지수를 입력해주세요");
    scanf("%d", &BMAX);
    
    B = (int*)malloc(sizeof(int) * (BMAX + 1));
    for (int i = 0; i <= BMAX; i++) {
        B[i] = 0;
    }

    while (sel2 == 1) {

        printf("지수와 계수를 입력하세요");
        scanf("%d %d", &exp, &co);
        B[exp] = co;

        printf("계속입력하시겠습니까?  1 : 계속 , 0 : 탈출");
        scanf("%d", &sel2);

    }


    for (int i = AMAX; i >= 0; i--) {
        if (i != 0) {
            if (A[i] != 0)
                printf(" %dx^%d + ", A[i], i);
        }
        else {
            if (A[i] != 0)
                printf("%d ", A[i]);
        }
    }

    printf("\n");


    for (int i = BMAX; i >= 0; i--) {
        if (i != 0) {
            if (B[i] != 0)
                printf(" %dx^%d + ", B[i], i);
        }
        else {
            if (B[i] != 0)
                printf("%d ", B[i]);
        }
    }
   

}

 

두 개의 다항식을 받아오는 것까지 구현을 완료하였다.

 


다음은 덧셈을 구현해보자.

덧셈을 구현하기 위해 필요한 과정을 생각해보자. 

뺄셈을 구현하는 것은 아니니.. 그건 신경 쓰지 말고 해보자..

 

우선 결과값을 가지는 새로운 배열을 동적 할당해야 할 것이다. 

그 배열은 최대값으로 A와 B 다항식 중 가장 큰값을 가진다.

 

한쪽이 0이라면 다른 한쪽의 다항식을 가질 것이고

둘다 값을 다지고 있다면 두 값을 더해야한다.

 

3가지 과정이 필요하다

추상자료형을 만들어보자.

ADT 다항식의 덧셈(){
	int *c;
    
    if(AMAX 와 BMAX 중에 큰 값은)
    
    c = (int*)malloc(sizeof(int) * (A와 B중 큰 최고차항값);
    
    for(int i=A와B중 큰 최고차항; i >=0 ; i--)
  		// A가 크다고 가정하고 작성
        if(AMAX가 BMAX보다 큰 동안)
        	A가 0이 아닌 값이 있다면 C에 저장해라.		// B의 범위를 벗어난 배열인 경우 오류가 발생할 것이란 판단
        if(AMAX와 BMAX가 겹치는 동안)
        	A와 B중 하나만 값을 가진다면 가지는값의 값을 C에 저장해라.
           	A와 B 둘 다 값을 가진다면 계수를 더하여 C에 저장해라.
   }
   
   C를 출력해 보여줘라.
}
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<malloc.h>



int main() {
    int* A = 0;
    int AMAX = 0;

    int* B = 0;
    int BMAX = 0; 

    int co, exp;
    int sel1 = 1;
    int sel2 = 1;

    printf("A 다항식을 입력합니다. \n");
    printf("최고차항의 지수를 입력해주세요");
    scanf("%d", &AMAX);
    
    A = (int*)malloc(sizeof(int) * (AMAX + 1));
    for (int i = 0; i <= AMAX; i++) {
        A[i] = 0;
    }

    while (sel1 == 1) {

        printf("지수와 계수를 입력하세요");
        scanf("%d %d", &exp, &co);
        A[exp] = co;

        printf("계속입력하시겠습니까?  1 : 계속 , 0 : 탈출");
        scanf("%d", &sel1);

    }


    printf("B 다항식을 입력합니다. \n");
    printf("최고차항의 지수를 입력해주세요");
    scanf("%d", &BMAX);
    
    B = (int*)malloc(sizeof(int) * (BMAX + 1));
    for (int i = 0; i <= BMAX; i++) {
        B[i] = 0;
    }

    while (sel2 == 1) {

        printf("지수와 계수를 입력하세요");
        scanf("%d %d", &exp, &co);
        B[exp] = co;

        printf("계속입력하시겠습니까?  1 : 계속 , 0 : 탈출");
        scanf("%d", &sel2);

    }


    for (int i = AMAX; i >= 0; i--) {
        if (i != 0) {
            if (A[i] != 0)
                printf(" %dx^%d + ", A[i], i);
        }
        else {
            if (A[i] != 0)
                printf("%d ", A[i]);
        }
    }

    printf("\n");


    for (int i = BMAX; i >= 0; i--) {
        if (i != 0) {
            if (B[i] != 0)
                printf(" %dx^%d + ", B[i], i);
        }
        else {
            if (B[i] != 0)
                printf("%d ", B[i]);
        }
    }


    printf("\n 어떤 작업을 진행할까요? 1. 덧셈, 2. ax^z를 곱하기, 3. 곱셈>>");
    scanf("%d", &sel1);

    if (sel1 == 1) {
        int MAX;
        if (AMAX > BMAX) {
            MAX = AMAX;
            sel2 = 1;
        }
        else {
            MAX = BMAX;
            sel2 = 2;
        }


        int* c;
        c = (int*)malloc(sizeof(int) * (MAX + 1));
        for (int i = 0; i <= MAX; i++) {
            c[i] = 0;
        }

        
        for (int i = MAX; i >= 0; i--) {
            if (sel2 == 1) { //A가 큰 경우
                if (i > BMAX && A[i] != 0)
                    c[i] = A[i];
                if (i <= BMAX && A[i] != 0 && B[i] != 0)
                    c[i] = A[i] + B[i];
                if (i <= BMAX && A[i] != 0 && B[i] == 0)
                    c[i] = A[i];
                if (i <= BMAX && A[i] == 0 && B[i] != 0)
                    c[i] = B[i];
            }
            if (sel2 == 2) { //A가 큰 경우
                if (i > AMAX && B[i] != 0)
                    c[i] = B[i];
                if (i <= AMAX && A[i] != 0 && B[i] != 0)
                    c[i] = A[i] + B[i];
                if (i <= AMAX && A[i] != 0 && B[i] == 0)
                    c[i] = A[i];
                if (i <= AMAX && A[i] == 0 && B[i] != 0)
                    c[i] = B[i];
            }

        }

        

        for (int i = MAX; i >= 0; i--) {
            if (i != 0) {
                if (c[i] != 0)
                    printf(" %dx^%d + ", c[i], i);
            }
            else {
                if (c[i] != 0)
                    printf("%d ", c[i]);
            }
        }

    }

   

}

덧셈까지 구현된 모습이다.

 

 


다음 단계는 곱셈에 대해 생각해보자.

그 전에 우리는 이것을 구현해야한다.

A나 B에 ax^z를 곱하는 경우를 먼저 해결해야한다.

 

A를 선택했다 가정하고

우선 곱셈이기 때문에 

C배열의 크기부터 생각을 해보자.

 C배열의 크기는 A의 최고차항에 지수를 더한 값일 것이다.

그리고 C배열에는 자신의 차수에 지수를 더한다.

그리고 계수끼리 곱한다. 이를 추상자료형으로 구현해보자.

 

ADT ax^z곱하기(){

	
    출력 ("A,B 중 어디에 연산을 할래요?");
    입력(A or B)
    
    곱할 지수와 계수를 입력하세요.
    입력 (지수, 계수);
    
    
    if(A라면){
    	int MAX = AMAX + 지수;
        int *c;
        c = (int*)malloc(sizeof(int) * (MAX + 1));
       
        for(int i= MAX; i>=0; i--){
        	if(A[i] != 0){
            	c[i+지수] = A[i] * 계수;
                A[i] = 0;
             }
        }
        
      if(B라면){
    	int MAX = BMAX + 지수;
        int *c;
        c = (int*)malloc(sizeof(int) * (MAX + 1));
       
        for(int i= MAX; i>=0; i--){
        	if(B[i] != 0){
            	c[i+지수] = A[i] * 계수;
                B[i] = 0;
             }
        }   
}

 

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<malloc.h>



int main() {
    int* A = 0;
    int AMAX = 0;

    int* B = 0;
    int BMAX = 0; 

    int co, exp;
    int sel1 = 1;
    int sel2 = 1;

    printf("A 다항식을 입력합니다. \n");
    printf("최고차항의 지수를 입력해주세요");
    scanf("%d", &AMAX);
    
    A = (int*)malloc(sizeof(int) * (AMAX + 1));
    for (int i = 0; i <= AMAX; i++) {
        A[i] = 0;
    }

    while (sel1 == 1) {

        printf("지수와 계수를 입력하세요");
        scanf("%d %d", &exp, &co);
        A[exp] = co;

        printf("계속입력하시겠습니까?  1 : 계속 , 0 : 탈출");
        scanf("%d", &sel1);

    }


    printf("B 다항식을 입력합니다. \n");
    printf("최고차항의 지수를 입력해주세요");
    scanf("%d", &BMAX);
    
    B = (int*)malloc(sizeof(int) * (BMAX + 1));
    for (int i = 0; i <= BMAX; i++) {
        B[i] = 0;
    }

    while (sel2 == 1) {

        printf("지수와 계수를 입력하세요");
        scanf("%d %d", &exp, &co);
        B[exp] = co;

        printf("계속입력하시겠습니까?  1 : 계속 , 0 : 탈출");
        scanf("%d", &sel2);

    }


    for (int i = AMAX; i >= 0; i--) {
        if (i != 0) {
            if (A[i] != 0)
                printf(" %dx^%d + ", A[i], i);
        }
        else {
            if (A[i] != 0)
                printf("%d ", A[i]);
        }
    }

    printf("\n");


    for (int i = BMAX; i >= 0; i--) {
        if (i != 0) {
            if (B[i] != 0)
                printf(" %dx^%d + ", B[i], i);
        }
        else {
            if (B[i] != 0)
                printf("%d ", B[i]);
        }
    }


    printf("\n 어떤 작업을 진행할까요? 1. 덧셈, 2. ax^z를 곱하기, 3. 곱셈>>");
    scanf("%d", &sel1);

    if (sel1 == 1) {
        int MAX;
        if (AMAX > BMAX) {
            MAX = AMAX;
            sel2 = 1;
        }
        else {
            MAX = BMAX;
            sel2 = 2;
        }


        int* c;
        c = (int*)malloc(sizeof(int) * (MAX + 1));
        for (int i = 0; i <= MAX; i++) {
            c[i] = 0;
        }

        
        for (int i = MAX; i >= 0; i--) {
            if (sel2 == 1) { //A가 큰 경우
                if (i > BMAX && A[i] != 0)
                    c[i] = A[i];
                if (i <= BMAX && A[i] != 0 && B[i] != 0)
                    c[i] = A[i] + B[i];
                if (i <= BMAX && A[i] != 0 && B[i] == 0)
                    c[i] = A[i];
                if (i <= BMAX && A[i] == 0 && B[i] != 0)
                    c[i] = B[i];
            }
            if (sel2 == 2) { //A가 큰 경우
                if (i > AMAX && B[i] != 0)
                    c[i] = B[i];
                if (i <= AMAX && A[i] != 0 && B[i] != 0)
                    c[i] = A[i] + B[i];
                if (i <= AMAX && A[i] != 0 && B[i] == 0)
                    c[i] = A[i];
                if (i <= AMAX && A[i] == 0 && B[i] != 0)
                    c[i] = B[i];
            }

        }

        

        for (int i = MAX; i >= 0; i--) {
            if (i != 0) {
                if (c[i] != 0)
                    printf(" %dx^%d + ", c[i], i);
            }
            else {
                if (c[i] != 0)
                    printf("%d ", c[i]);
            }
        }

    }

    if (sel1 == 2) {
        printf("A,B중에 선택하세요. A = 1, B = 2 >> ");
        scanf("%d", &sel2);

        printf("곱할 지수와 계수를 입력하세요.");
        scanf("%d %d", &exp, &co);

        if (sel2 == 1) {
            int MAX = AMAX + exp;
            int* c;
            c = (int*)malloc(sizeof(int) * (MAX + 1));
            for (int i = 0; i <= MAX; i++) {
                c[i] = 0;
            }

            for (int i = MAX; i >= 0; i--) {
                if (A[i] != 0) {
                    c[i + exp] = A[i] * co;
                    A[i] = 0;
                }
            }

            for (int i = MAX; i >= 0; i--) {
                if (i != 0) {
                    if (c[i] != 0)
                        printf(" %dx^%d + ", c[i], i);
                }
                else {
                    if (c[i] != 0)
                        printf("%d ", c[i]);
                }
            }
        }

        if (sel2 == 2) {
            int MAX = BMAX + exp;
            int* c;
            c = (int*)malloc(sizeof(int) * (MAX + 1));
            for (int i = 0; i <= MAX; i++) {
                c[i] = 0;
            }

            for (int i = MAX; i >= 0; i--) {
                if (B[i] != 0) {
                    c[i + exp] = B[i] * co;
                    B[i] = 0;
                }
            }

            for (int i = MAX; i >= 0; i--) {
                if (i != 0) {
                    if (c[i] != 0)
                        printf(" %dx^%d + ", c[i], i);
                }
                else {
                    if (c[i] != 0)
                        printf("%d ", c[i]);
                }
            }
        }
    }

}

 

 

 

 

 


곱셈을 구현하기 전에 지금까지 만든 것을 함수로 나누고 코드를 간소화하는 과정을 진행하려고 한다.

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<malloc.h>

void show(int* A, int size) {
    for (int i = size; i >= 0; i--) {
        if (i != 0) {
            if (A[i] != 0)
                printf(" %dx^%d + ", A[i], i);
        }
        else {
            if (A[i] != 0)
                printf("%d ", A[i]);
        }
    }
}



void plus(int* A, int* B, int AMAX, int BMAX) {
    int MAX;
    int sel = 0;
    if (AMAX > BMAX) {
        MAX = AMAX;
        sel = 1;
    }
    else {
        MAX = BMAX;
        sel = 2;
    }


    int* c;
    c = (int*)malloc(sizeof(int) * (MAX + 1));
    for (int i = 0; i <= MAX; i++) {
        c[i] = 0;
    }


    for (int i = MAX; i >= 0; i--) {
        if (sel == 1) { //A가 큰 경우
            if (i > BMAX && A[i] != 0)
                c[i] = A[i];
            if (i <= BMAX && A[i] != 0 && B[i] != 0)
                c[i] = A[i] + B[i];
            if (i <= BMAX && A[i] != 0 && B[i] == 0)
                c[i] = A[i];
            if (i <= BMAX && A[i] == 0 && B[i] != 0)
                c[i] = B[i];
        }
        if (sel == 2) { //A가 큰 경우
            if (i > AMAX && B[i] != 0)
                c[i] = B[i];
            if (i <= AMAX && A[i] != 0 && B[i] != 0)
                c[i] = A[i] + B[i];
            if (i <= AMAX && A[i] != 0 && B[i] == 0)
                c[i] = A[i];
            if (i <= AMAX && A[i] == 0 && B[i] != 0)
                c[i] = B[i];
        }

    }

    show(c, MAX);
}


void mulhang(int* A, int AMAX, int co, int exp) {
    int MAX = AMAX + exp;
    int* c;
    c = (int*)malloc(sizeof(int) * (MAX + 1));
    for (int i = 0; i <= MAX; i++) {
        c[i] = 0;
    }

    for (int i = MAX; i >= 0; i--) {
        if (A[i] != 0) {
            c[i + exp] = A[i] * co;
            A[i] = 0;
        }
    }

    show(c, MAX);
}


void input(int* A, int AMAX) {
    int sel = 1;
    int co, exp;
    for (int i = 0; i <= AMAX; i++) {
        A[i] = 0;
    }

    while (sel == 1) {

        printf("지수와 계수를 입력하세요");
        scanf("%d %d", &exp, &co);
        A[exp] = co;

        printf("계속입력하시겠습니까?  1 : 계속 , 0 : 탈출");
        scanf("%d", &sel);

    }
}


int main() {
    int* A = 0;
    int AMAX = 0;

    int* B = 0;
    int BMAX = 0; 

    int co, exp;
    int sel1 = 1;
    int sel2 = 1;

    printf("A 다항식을 입력합니다. \n");
    printf("최고차항의 지수를 입력해주세요");
    scanf("%d", &AMAX);
    
    A = (int*)malloc(sizeof(int) * (AMAX + 1));
    input(A, AMAX);
   


    printf("B 다항식을 입력합니다. \n");
    printf("최고차항의 지수를 입력해주세요");
    scanf("%d", &BMAX);
    
    B = (int*)malloc(sizeof(int) * (BMAX + 1));
    input(B, BMAX);
  

    show(A, AMAX);
    printf("\n");
    show(B, BMAX);



    printf("\n 어떤 작업을 진행할까요? 1. 덧셈, 2. ax^z를 곱하기, 3. 곱셈>>");
    scanf("%d", &sel1);

    if (sel1 == 1) {
        plus(A, B, AMAX, BMAX);
    }

    if (sel1 == 2) {

        printf("A,B중에 선택하세요. A = 1, B = 2 >> ");
        scanf("%d", &sel2);

        printf("곱할 지수와 계수를 입력하세요.");
        scanf("%d %d", &exp, &co);

        if (sel2 == 1) {
            mulhang(A, AMAX, co, exp);
        }

        if (sel2 == 2) {
            mulhang(B, BMAX, co, exp);
        }
    }

}

 


곱셈을 구현하려면

ax^z를 곱하는 연산과 덧셈연산이 동시에 사용된다. 

그러한 이유로 코드를 분할하였다.

 

고민을 해보자.

x^1 + 1 과 x^1 + 1의 곱셈을 계산한다고 하였을 때

x^1이 B다항식에 곱해진후 C다항식에 저장한다.

1이 B다항식에 곱해진 후 D다항식에 저장한다.

C+D를 진행한다.

 

이렇게 생각할 수 있을 것이다.

그러면

x^2+ x + 1 과 x^2 +x + 1 의 경우에는 어떻게 할 것인가?

x^2 곱셈을 연산한 후 C다항식에 저장하고 초기화된 D다항식과 덧셈한다.

C다항식을 초기화한다.

x 곱셈을 연산한 후 C다항식에 저장하고 D다항식과 덧셈한다.

C다항식을 초기화한다.

1을 곱셈한 후 C다항식에 저장하고 D다항식과 덧셈한다.

C다항식을 초기화한다.

 

해당 과정을 진행하는 알고리즘을 고민해야할 것이다.

추상자료형을 우선 고민해보자.

 

ADT 다항식의곱셈(){
    int d*;
    
    d = (int*)malloc(sizeof(int) * (AMAX + BMAX));
    
    for(int i=AMAX; i >= 0; i--){
    	if(A[i] != 0){
        	mulhang(B, AMAX, A[i], i, d, AMAX+BMAX);
        }
    }


}

 

여기서 큰 문제가 보였다.

내가 만든 코드의 큰 문제가 있었는데, 한 번의 식은 사용이 가능하나 이걸 연속으로 구현하려면

나눠놓은 함수를 사용할 수 없게 되었다.

 

일단 문제는 풀어야하니까 함수로 나누는 것이 아니라 main()에 구현하는 것으로 하겠음.

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<malloc.h>

void show(int* A, int size) {
    for (int i = size; i >= 0; i--) {
        if (i != 0) {
            if (A[i] != 0)
                printf(" %dx^%d + ", A[i], i);
        }
        else {
            if (A[i] != 0)
                printf("%d ", A[i]);
        }
    }
}



void plus(int* A, int* B, int AMAX, int BMAX) {
    int MAX;
    int sel = 0;
    if (AMAX > BMAX) {
        MAX = AMAX;
        sel = 1;
    }
    else {
        MAX = BMAX;
        sel = 2;
    }


    int* c;
    c = (int*)malloc(sizeof(int) * (MAX + 1));
    for (int i = 0; i <= MAX; i++) {
        c[i] = 0;
    }


    for (int i = MAX; i >= 0; i--) {
        if (sel == 1) { //A가 큰 경우
            if (i > BMAX && A[i] != 0)
                c[i] = A[i];
            if (i <= BMAX && A[i] != 0 && B[i] != 0)
                c[i] = A[i] + B[i];
            if (i <= BMAX && A[i] != 0 && B[i] == 0)
                c[i] = A[i];
            if (i <= BMAX && A[i] == 0 && B[i] != 0)
                c[i] = B[i];
        }
        if (sel == 2) { //A가 큰 경우
            if (i > AMAX && B[i] != 0)
                c[i] = B[i];
            if (i <= AMAX && A[i] != 0 && B[i] != 0)
                c[i] = A[i] + B[i];
            if (i <= AMAX && A[i] != 0 && B[i] == 0)
                c[i] = A[i];
            if (i <= AMAX && A[i] == 0 && B[i] != 0)
                c[i] = B[i];
        }

    }

    show(c, MAX);
}


void mulhang(int* A, int AMAX, int co, int exp) {
    int MAX = AMAX + exp;
    int* c;
    c = (int*)malloc(sizeof(int) * (MAX + 1));
    for (int i = 0; i <= MAX; i++) {
        c[i] = 0;
    }

    for (int i = MAX; i >= 0; i--) {
        if (A[i] != 0) {
            c[i + exp] = A[i] * co;
            A[i] = 0;
        }
    }

    show(c, MAX);
}


void input(int* A, int AMAX) {
    int sel = 1;
    int co, exp;
    for (int i = 0; i <= AMAX; i++) {
        A[i] = 0;
    }

    while (sel == 1) {

        printf("지수와 계수를 입력하세요");
        scanf("%d %d", &exp, &co);
        A[exp] = co;

        printf("계속입력하시겠습니까?  1 : 계속 , 0 : 탈출");
        scanf("%d", &sel);

    }
}


int main() {
    int* A = 0;
    int AMAX = 0;

    int* B = 0;
    int BMAX = 0; 

    int co, exp;
    int sel1 = 1;
    int sel2 = 1;

    printf("A 다항식을 입력합니다. \n");
    printf("최고차항의 지수를 입력해주세요");
    scanf("%d", &AMAX);
    
    A = (int*)malloc(sizeof(int) * (AMAX + 1));
    input(A, AMAX);
   


    printf("B 다항식을 입력합니다. \n");
    printf("최고차항의 지수를 입력해주세요");
    scanf("%d", &BMAX);
    
    B = (int*)malloc(sizeof(int) * (BMAX + 1));
    input(B, BMAX);
  

    show(A, AMAX);
    printf("\n");
    show(B, BMAX);



    printf("\n 어떤 작업을 진행할까요? 1. 덧셈, 2. ax^z를 곱하기, 3. 곱셈>>");
    scanf("%d", &sel1);

    if (sel1 == 1) {
        plus(A, B, AMAX, BMAX);
    }

    if (sel1 == 2) {

        printf("A,B중에 선택하세요. A = 1, B = 2 >> ");
        scanf("%d", &sel2);

        printf("곱할 지수와 계수를 입력하세요.");
        scanf("%d %d", &exp, &co);

        if (sel2 == 1) {
            mulhang(A, AMAX, co, exp);
        }

        if (sel2 == 2) {
            mulhang(B, BMAX, co, exp);
        }
    }

    if (sel1 == 3) {

        int MAX = AMAX + BMAX;
        int* c;
        c = (int*)malloc(sizeof(int) * (MAX + 1));
        
        int* d;
        d = (int*)malloc(sizeof(int) * (MAX + 1));
        for (int p = 0; p <= MAX; p++) {
            d[p] = 0;
        }

        for (int i = AMAX; i >= 0; i--) {
            for (int p = 0; p <= MAX; p++) {
                c[p] = 0;
            }

            if (A[i] != 0) {
                for (int j = BMAX; j >= 0; j--) {
                    if (B[j] != 0) 
                        c[j + i] = B[j] * A[i];
                }

                show(c, MAX);
                printf("\n  \n");

                
                for (int i = MAX; i >= 0; i--) {
                        if (i > MAX && c[i] != 0)
                            d[i] = c[i];
                        if (i <= MAX && c[i] != 0 && d[i] != 0)
                            d[i] = c[i] + d[i];
                        if (i <= MAX && c[i] != 0 && d[i] == 0)
                            d[i] = c[i];
                        if (i <= MAX && c[i] == 0 && d[i] != 0)
                            d[i] = d[i];
                    }
              

                }

            }
        printf("--------------------- \n");
        show(d, MAX);
        }

}

 

 

어거지로 완성은 했으나..

 

원래는 구조체를 사용하는 문제인거 같습니다.

 

말록으로 구현하고 이를 넘기고 받을 생각을 했는데, 난이도도 높아졌고

 

단계별로 진행하다보니 함수가 많이 꼬였습니다.