EASY7

[C언어] 다항식 더하기 본문

개발 공부/C

[C언어] 다항식 더하기

E.asiest 2017. 10. 4. 18:07

c언어에서 다항식을 표현하는 것에는 두가지 방법이 있다.

poly_add1은 배열을 이용해 0차부터 최고차항까지 다 표현한다. 연산이 편리한 장점이 있다.

poly_add2는 0이 아닌 차수만 표현하기에 메모리 낭비가 적다.

 

 

 

#include <stdio.h>#define MAX(a,b) (((a)>(b))?(a):(b))

#define MAX_DEGREE 10
typedef struct
{
    int degree;
    int coef[MAX_DEGREE];
} polynomial;
 
polynomial poly_add1(polynomial A, polynomial B)
{
    int i;
    polynomial C;
    int Apos = 0, Bpos = 0, Cpos = 0;
    int degree_a = A.degree, degree_b = B.degree;
    C.degree = MAX(A.degree, B.degree);
    while (Apos <= A.degree && Bpos <= B.degree) {
        if (degree_a > degree_b) {
            C.coef[Cpos++] = A.coef[Apos++];
            degree_a--;
        }
        else if (degree_a == degree_b) {
            C.coef[Cpos++] = A.coef[Apos++] + B.coef[Bpos++];
            degree_a--; degree_b--;
        }
        else {
            C.coef[Cpos++] = B.coef[Bpos++];
            degree_b--;
        }
    }
    while (C.coef[0] == 0)
    {
        for (i = 0; i < C.degree; i++)
        {
            C.coef[i] = C.coef[i + 1];
        }
        C.degree--;
 
    }
    return C;
}
void print_poly1(polynomial p)
{
 
    int i;
    int exponent = p.degree;
 
    for (i = 0; i <= p.degree; i++)
    {
        if (p.coef[i] != 0)
            printf("%dx^%d ", p.coef[i], exponent);
        exponent--;
    }printf("\n");
}
int main(void) {
    polynomial a = { 6,{ 4, 3, 6, 0, 0, 0, 10 } };
    polynomial b = { 6,{ -4, -3, 7, 0, 5, 1, 10 } };
    //polynomial a = {6, {4, 3, 6, 0, 0, 0, 10}};
    //polynomial b = {4, {7, 0, -5, 1, 0}};
    polynomial c;
    c = poly_add1(a, b);
    printf("a = "); print_poly1(a);
    printf("b = "); print_poly1(b);
    printf("a + b = c = "); print_poly1(c);
    printf("C의 차수:%d\n", c.degree);
}

 

 

#include <stdio.h>
#define MAX_TERMS 11
typedef struct {
    int coef;
    int expon;
} term;
 
int poly_add2(term t1[], int t1Size, term t2[], int t2Size, term t3[])
{
 
    int i = 0, j = 0, k = 0;
    int coef;
    while (i < t1Size && j < t2Size)
    {
        if (t1[i].expon > t2[j].expon)
            t3[k++] = t1[i++];
        else if (t1[i].expon == t2[j].expon)
        {
            if ((coef = t1[i].coef + t2[j].coef) != 0)
            {
                t3[k].coef = coef;
                t3[k].expon = t1[i].expon;
                k++;
            }
            i++; j++;
 
        }
        else
            t3[k++] = t2[j++];
 
    }
    while (i < t1Size)
        t3[k++] = t1[i++];
 
    while (j < t2Size)
        t3[k++] = t2[j++];
 
 
    return k;
}
 
 
void print_poly2(term t[], int tSize)
{
    int i = 0;
 
    for (i = 0; i < tSize; i++)
    {
        printf("%dx^%d ", t[i].coef, t[i].expon);
 
    }printf("\n");
}
 
 
 
int main(void)
{
    term a[] = { { 60, 6 },{ 40, 4 },{ 30, 3 },{ 10, 1 } };
    int aSize = sizeof(a) / sizeof(a[0]);
    term b[] = { { -60, 5 },{ -40, 4 },{ -10, 1 } };
    int bSize = sizeof(b) / sizeof(b[0]);
 
 
 
 
 
    term c[MAX_TERMS];
    int cSize;
 
 
    cSize = poly_add2(a, aSize, b, bSize, c);
 
    printf("a = ");
    print_poly2(a, aSize);
    printf("b = ");
    print_poly2(b, bSize);
    printf("c = ");
    print_poly2(c, cSize);
 
    printf("\nC 항의 개수%d", cSize);
 
 
}
Comments