c语言实现一元n次多项式的计算

想问一下各位,我想表达的是手写的那张图片的意思。为什么编译器总让我输入5个关于题中一维数组的值呀?如果n为3的话,不是只能输入4个吗?

img

img

img

img

可能是你把n定义为double类型了,你把他定义为int类型试试,有时候double类型的数值和int的数值有很微小的偏差。


#include<stdio.h>

#include<stdlib.h>

#define maxsize 100

typedef struct node {

    int a[maxsize];

    int length;

} list;

//初始化顺序表

list* creat_list()

{

    struct node* L;

    L = (list*)malloc(sizeof(struct node));

    L->length = 0;

    return L;

}

void input(list* L)//一元多项式的输入

{

    int i;

    printf("请输入此多项式的项数:");

    scanf("%d", &L->length);

    for (i = 0; i < L->length; i++)

    {

        printf("请输入此多项式X^%d项的系数: ", i);

        scanf("%d", &L->a[i]);

    }

    printf("\n");

}

void output(struct node* L) //一元多项式的输出

{

    int i, t = 0;

    for (i = L->length - 1; i >= 0; i--)

    {

        if (L->a[i] == 0)

        {

            t++;

            continue;

        }

        else

        {

            if (i == 0)

            {

                if (L->a[i] < 0)

                    printf("%d", L->a[i]);

                else

                    printf("+%d", L->a[i]);

            }

            else if (0 < i && i < L->length - 1)

            {

                if (i == 1)

                {

                    if (L->a[i] < 0)

                        printf("%d*X", L->a[i]);

                    else

                        printf("+%d*X", L->a[i]);

                }

                else

                {

                    if (L->a[i] < 0)

                        printf("%d*X^%d", L->a[i], i);

                    else

                        printf("+%d*X^%d", L->a[i], i);

                }

            }

            else if (i == L->length - 1)

            {

                if (i == 1)

                {

                    printf("%d*X", L->a[i]);

                }

                else

                    printf("%d*X^%d", L->a[i], i);

            }

        }

    }

    if (t == L->length)

    {

        printf("0\n");

    }

    printf("\n");

}

list* sum(list* L1, list* L2) //实现两个一元多项式的相加操作

{

    int i, h;

    struct node* p;

    list* L3;

    L3 = creat_list();

    if (L1->length <= L2->length)

    {

        p = L1;

        h = L2->length - L1->length;

    }

    else

    {

        p = L2;

        h = L1->length - L2->length;

    }

    for (i = 0; i < p->length; i++)

    {

        L3->a[i] = L1->a[i] + L2->a[i];

        L3->length++;

    }

    if (h != 0)

    {

        if (p == L1)

        {

            for (i = L1->length; i <= L2->length - 1; i++)

            {

                L3->a[i] = L2->a[i];

                L3->length++;

            }

        }

        else

            for (i = L2->length; i <= L1->length - 1; i++)

            {

                L3->a[i] = L1->a[i];

                L3->length++;

            }

    }

    return L3;

}

list* poor(list* L1, list* L2)//实现两个一元多项式的相减操作

{

    int i, h;

    struct node* p;

    list* L;

    L = creat_list();

    h = L1->length - L2->length;

    if (h <= 0)

    {

        p = L1;

    }

    else

    {

        p = L2;

    }

    for (i = 0; i < p->length; i++)

    {

        L->a[i] = L1->a[i] - L2->a[i];

        L->length++;

    }

    if (h != 0)

    {



        if (p == L2)

        {

            for (i = L2->length; i <= L1->length - 1; i++)

            {

                L->a[i] = L1->a[i];

                L->length++;

            }

        }

        if (p == L1)

        {

            for (i = L1->length; i <= L2->length - 1; i++)

            {

                L->a[i] = -1 * (L2->a[i]);

                L->length++;

            }

        }

    }

    return L;

}

list* multiply(list* L1, list* L2)  //实现两个多项式的相乘

{

    int i, j, k;

    list* L;

    L = creat_list();

    for (i = 0; i <= L1->length - 1; i++)

    {

        list* p = creat_list();

        p->length = i + L2->length;

        for (k = 0; k <= p->length - 1; k++)

        {

            p->a[k] = 0;

        }

        for (j = 0; j <= L2->length - 1; j++)

        {

            p->a[i + j] = L1->a[i] * L2->a[j];

        }

        L = sum(L, p);

    }

    return L;

}

void show()

{

    printf("\t\t    指令集合\n");

    printf("\n\t1 《《《《《 一元多项式的加法运算\n");

    printf("\n\t2 《《《《《 一元多项式的减法运算\n");

    printf("\n\t3 《《《《《 一元多项式的乘法运算\n");

}

void main()

{

    int i, h;

    list* P;

    list* L[2];

    for (i = 0; i < 2; i++)

    {

        L[i] = creat_list();

        printf("\t请输入第%d个一元多项式\n", i + 1);

        input(L[i]);

        printf("第%d个一元多项式的表达式为:\n", i + 1);

        printf("\tF%d(X)=", i + 1);

        output(L[i]);

        printf("\n\n");

    }

    show();

    printf("请对两个多项式选择相关运算指令:\n");

    scanf("%d", &h);

    switch (h)

    {

        case 1:

            P = sum(L[0], L[1]);

            printf("两个一元多项式的和为:\n\tF3(X)=");

            output(P);
            break;

        case 2:

            printf("两个一元多项式的差为:\n\tF3(X)=");

            P = poor(L[0], L[1]);

            output(P);
            break;

        case 3:

            printf("两个一元多项式的乘积为:\n\tF3(X)=");

            P = multiply(L[0], L[1]);

            output(P);
            break;

        default:

            printf("指令错误!\n");

    }

}

把你的 <= n 改成 < n,否则从0开始,就多了一个。