每日一练算法题(一元多项式运算器——建立与输出)

7-1 一元多项式运算器——建立与输出
#include <stdio.h>
#include <stdlib.h>

typedef struct node {
    int data1;
    int data2;
    struct node* next;
} Node, * LinkList;

int main() {
    int n;
    scanf("%d", &n);
    getchar();

    LinkList head = (Node*)malloc(sizeof(Node));
    head->next = NULL;

    int a = 0, b = 0;
    char aa = 0, bb = 0;

    Node* p;
    Node* q = head;
    for (int i = 0; i < n; i++) {
        // 尾插法建立链表
        p = (Node*)malloc(sizeof(Node));
        while ((aa = getchar()) == '\n');
        scanf("%d,%d", &a, &b);
        getchar();
        p->data1 = a;
        p->data2 = b;
        q->next = p;
        q = p;
    }
    q->next = NULL;

    Node* s = head->next;
    while (s) {
        if (s->data1!= 0) {
            if (s->data2 == 0) {
                printf("%d", s->data1);
            } else if (s->data2 == 1) {
                if (s->data1 == 1) {
                    printf("X");
                } else if (s->data1 == -1) {
                    printf("-X");
                } else {
                    printf("%dX", s->data1);
                }
            } else {
                if (s->data1 == 1) {
                    printf("X^%d", s->data2);
                } else if (s->data1 == -1) {
                    printf("-X^%d", s->data2);
                } else {
                    printf("%dX^%d", s->data1, s->data2);
                }
            }
            if (s->next && s->next->data1 > 0) {
                printf("+");
            }
        }
        s = s->next;
    }

    return 0;
}
一元多项式运算器——加法
#include <stdio.h>
#include <stdlib.h>

// 函数功能:两个多项式相加
int addPolynomials(int max[][3], int min[][3], int n1, int n2) {
    int cnt = n1 + 1;
    for (int i = 1; i <= n2; i++) {
        int flag = 1;
        for (int j = 1; j <= n1; j++) {
            if (min[i][2] == max[j][2]) {
                max[j][1] += min[i][1];
                flag = 0;
                break;
            }
        }
        if (flag) {
            max[cnt][1] = min[i][1];
            max[cnt++][2] = min[i][2];
        }
    }
    return cnt - 1;
}

// 比较函数,用于 qsort 排序
int compare(const void* a, const void* b) {
    return ((int*)a)[2] - ((int*)b)[2];
}

// 函数功能:打印多项式
void printPolynomial(int a[][3], int n) {
    int cnt = 0;
    for (int i = 1; i <= n; i++) {
        if (a[i][1] == 0) {
            if (cnt!= 0 && a[i + 1][1] > 0 && i!= n)
                printf("+");
        } else {
            if (a[i][1] == 1) {
                if (a[i][2] == 0) {
                    printf("1");
                } else if (a[i][2] == 1) {
                    printf("X");
                } else {
                    printf("X^%d", a[i][2]);
                }
            } else if (a[i][1] == -1) {
                if (a[i][2] == 0) {
                    printf("-1");
                } else if (a[i][2] == 1) {
                    printf("-X");
                } else {
                    printf("-X^%d", a[i][2]);
                }
            } else {
                if (a[i][2] == 0) {
                    printf("%d", a[i][1]);
                } else if (a[i][2] == 1) {
                    printf("%dX", a[i][1]);
                } else {
                    printf("%dX^%d", a[i][1], a[i][2]);
                }
            }
            if (a[i + 1][1] > 0 && i!= n)
                printf("+");
            cnt = 1;
        }
    }
}

int main() {
    int n1, n2;
    int n;
    int a[100][3], b[100][3];
    scanf("%d", &n1);
    getchar();
    for (int i = 1; i <= n1; i++) {
        scanf("(%d,%d)", &a[i][1], &a[i][2]);
    }
    scanf("%d", &n2);
    getchar();
    for (int i = 1; i <= n2; i++) {
        scanf("(%d,%d)", &b[i][1], &b[i][2]);
    }

    if (n1 > n2) {
        n = addPolynomials(a, b, n1, n2);
        // 使用 qsort 进行排序
        qsort(a + 1, n, sizeof(a[0]), compare);
        printPolynomial(a, n);
    } else {
        n = addPolynomials(b, a, n2, n1);
        qsort(b + 1, n, sizeof(b[0]), compare);
        printPolynomial(b, n);
    }

    return 0;
}
一元多项式运算器——减法
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// 定义新的结构体名称 PolynomialNode 和 PolynomialList
typedef struct polynomialNode {
    int coefficient;
    int exponent;
    struct polynomialNode *next;
} PolynomialNode, *PolynomialList;

PolynomialList createPolynomial(int numTerms) {
    PolynomialList polynomialHead;
    polynomialHead = (PolynomialList)malloc(sizeof(PolynomialNode));
    PolynomialList prev, newNode;
    prev = polynomialHead;
    char a, b;
    for (int j = 0; j <= numTerms; j++) {
        newNode = (PolynomialList)malloc(sizeof(PolynomialNode));
        scanf("%c%d,%d%c", &a, &newNode->coefficient, &newNode->exponent, &b);
        prev->next = newNode;
        prev = newNode;
    }
    return polynomialHead;
}

void printPolynomial(PolynomialList polynomialHead) {
    PolynomialList node = polynomialHead->next->next;
    int flag = 1;
    if (!node) {
        putchar('0');
        printf("\n");
        return;
    }
    while (node) {
        if (node->coefficient > 0 && flag!= 1) {
            putchar('+');
        }
        if (node->coefficient!= 1 && node->coefficient!= -1) {
            printf("%d", node->coefficient);
            if (node->exponent == 1) {
                putchar('X');
            } else if (node->exponent) {
                printf("X^%d", node->exponent);
            }
        } else {
            if (node->coefficient == 1) {
                if (!node->exponent) {
                    putchar('1');
                } else if (node->exponent == 1) {
                    putchar('X');
                } else {
                    printf("X^%d", node->exponent);
                }
            }
            if (node->coefficient == -1) {
                if (!node->exponent) {
                    printf("-1");
                } else if (node->exponent == 1) {
                    printf("-X");
                } else {
                    printf("-X^%d", node->exponent);
                }
            }
        }
        node = node->next;
        flag++;
    }
}

PolynomialList addPolynomials(PolynomialList polynomial1Head, PolynomialList polynomial2Head) {
    PolynomialList prev1 = NULL, node1 = NULL, prev2 = NULL, node2 = NULL;
    prev1 = polynomial1Head->next;
    node1 = polynomial1Head->next->next;
    prev2 = polynomial2Head->next;
    node2 = polynomial2Head->next->next;
    int index = 1;
    while (node1!= NULL) {
        if (node2 == NULL) {
            return polynomial1Head;
        }
        if (node1->exponent == node2->exponent) {
            node1->coefficient = node1->coefficient - node2->coefficient;
            if (node1->coefficient == 0) {
                prev1->next = node1->next;
                free(node1);
                if (prev1) {
                    node1 = prev1->next;
                } else {
                    node1 = NULL;
                }
                prev2->next = node2->next;
                free(node2);
                if (prev2) {
                    node2 = prev2->next;
                } else {
                    node2 = NULL;
                }
            } else {
                prev1 = node1;
                node1 = node1->next;
                prev2->next = node2->next;
                free(node2);
                if (prev2) {
                    node2 = prev2->next;
                } else {
                    node2 = NULL;
                }
            }
        } else if (node1->exponent > node2->exponent) {
            node2->coefficient = -node2->coefficient;
            prev2->next = node2->next;
            node2->next = node1;
            prev1->next = node2;
            prev1 = node2;
            node2 = prev2->next;
        } else if (node2->exponent > node1->exponent && node1->next && node2->exponent < (node1->next)->exponent) {
            node2->coefficient = -node2->coefficient;
            prev2->next = node2->next;
            prev1 = node1;
            node1 = node1->next;
            node2->next = node1;
            prev1->next = node2;
            prev1 = node2;
            node2 = prev2->next;
        } else if (node2->exponent > node1->exponent && node1->next && node2->exponent >= (node1->next)->exponent) {
            prev1 = node1;
            node1 = node1->next;
        } else {
            prev1 = node1;
            break;
        }
        index++;
    }
    if (node2) {
        prev1->next = node2;
        PolynomialList temp = node2;
        while (temp) {
            temp->coefficient = -temp->coefficient;
            temp = temp->next;
        }
    }
    return polynomial1Head;
}

int main() {
    int numTerms1, numTerms2;
    PolynomialList polynomial1Head, polynomial2Head;
    scanf("%d", &numTerms1);
    polynomial1Head = createPolynomial(numTerms1);
    scanf("%d", &numTerms2);
    polynomial2Head = createPolynomial(numTerms2);
    PolynomialList resultPolynomial = addPolynomials(polynomial1Head, polynomial2Head);
    printPolynomial(resultPolynomial);
    return 0;
}
一元多项式运算器——乘法
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct polynomialNode {
    int coef;
    int expn;
    struct polynomialNode *next;
} PolynomialNode;
typedef PolynomialNode *PolynomialList;

// 创建多项式链表
PolynomialList createPolynomial(int n) {
    PolynomialList head = (PolynomialList)malloc(sizeof(PolynomialNode));
    head->next = NULL;
    PolynomialList pre = head;
    char a, b;
    for (int j = 0; j <= n; j++) {
        PolynomialList pnew = (PolynomialList)malloc(sizeof(PolynomialNode));
        scanf("%c%d,%d%c", &a, &pnew->coef, &pnew->expn, &b);
        pre->next = pnew;
        pre = pnew;
    }
    return head;
}

// 打印多项式链表
void printPolynomial(PolynomialList head) {
    PolynomialList q = head->next->next;
    int flag = 1;
    if (!q) {
        putchar('0');
        printf("\n");
        return;
    }
    while (q) {
        if (q->coef > 0 && flag!= 1) {
            putchar('+');
        }
        if (q->coef!= 1 && q->coef!= -1) {
            printf("%d", q->coef);
            if (q->expn == 1) {
                putchar('X');
            } else if (q->expn > 1) {
                printf("X^%d", q->expn);
            }
        } else {
            if (q->coef == 1) {
                if (!q->expn) {
                    putchar('1');
                } else if (q->expn == 1) {
                    putchar('X');
                } else {
                    printf("X^%d", q->expn);
                }
            }
            if (q->coef == -1) {
                if (!q->expn) {
                    printf("-1");
                } else if (q->expn == 1) {
                    putchar('-');
                    putchar('X');
                } else {
                    printf("-X^%d", q->expn);
                }
            }
        }
        q = q->next;
        flag++;
    }
    printf("\n");
}

// 复制链表
PolynomialList copyPolynomialList(PolynomialList head) {
    PolynomialList newHead = (PolynomialList)malloc(sizeof(PolynomialNode));
    newHead->next = NULL;
    PolynomialList p = head->next;
    PolynomialList p2 = newHead;
    while (p) {
        PolynomialList newNode = (PolynomialList)malloc(sizeof(PolynomialNode));
        newNode->coef = p->coef;
        newNode->expn = p->expn;
        p2->next = newNode;
        p2 = newNode;
        p = p->next;
    }
    p2->next = NULL;
    return newHead;
}

// 两个多项式链表相加
PolynomialList addPolynomialLists(PolynomialList head1, PolynomialList head2) {
    PolynomialList pre1 = NULL, p1 = NULL, pre2 = NULL, p2 = NULL;
    pre1 = head1->next;
    p1 = head1->next->next;
    pre2 = head2->next;
    p2 = head2->next->next;
    int index = 1;
    while (p1!= NULL) {
        if (p2 == NULL) {
            return head1;
        }
        if (p1->expn == p2->expn) {
            p1->coef = p1->coef + p2->coef;
            if (p1->coef == 0) {
                pre1->next = p1->next;
                free(p1);
                if (pre1) {
                    p1 = pre1->next;
                } else {
                    p1 = NULL;
                }
                pre2->next = p2->next;
                free(p2);
                if (pre2) {
                    p2 = pre2->next;
                } else {
                    p2 = NULL;
                }
            } else {
                pre1 = p1;
                p1 = p1->next;
                pre2->next = p2->next;
                free(p2);
                if (pre2) {
                    p2 = pre2->next;
                } else {
                    p2 = NULL;
                }
            }
        } else if (p1->expn > p2->expn) {
            pre2->next = p2->next;
            p2->next = p1;
            pre1->next = p2;
            pre1 = p2;
            p2 = pre2->next;
        } else if (p2->expn > p1->expn && p1->next && p2->expn < (p1->next)->expn) {
            pre2->next = p2->next;
            pre1 = p1;
            p1 = p1->next;
            p2->next = p1;
            pre1->next = p2;
            pre1 = p2;
            p2 = pre2->next;
        } else if (p2->expn > p1->expn && p1->next && p2->expn >= (p1->next)->expn) {
            pre1 = p1;
            p1 = p1->next;
        } else {
            pre1 = p1;
            break;
        }
        index++;
    }
    if (p2) {
        pre1->next = p2;
    }
    return head1;
}

// 两个多项式链表相乘
PolynomialList multiplyPolynomialLists(PolynomialList head1, PolynomialList head2) {
    PolynomialList p2 = head2->next->next;
    PolynomialList newHead = (PolynomialList)malloc(sizeof(PolynomialNode));
    PolynomialList pp = (PolynomialList)malloc(sizeof(PolynomialNode));
    newHead->next = pp;
    pp->next = NULL;
    PolynomialList p1;
    PolynomialList head1Pre = copyPolynomialList(head1);
    PolynomialList res = NULL;
    while (p2) {
        p1 = head1->next->next;
        while (p1) {
            p1->coef *= p2->coef;
            p1->expn += p2->expn;
            p1 = p1->next;
        }
        p2 = p2->next;
        res = addPolynomialLists(head1, newHead);
        newHead = copyPolynomialList(head1);
        head1 = copyPolynomialList(head1Pre);
    }
    return res;
}

int main() {
    int n1, n2;
    PolynomialList head1, head2;
    scanf("%d", &n1);
    head1 = createPolynomial(n1);
    scanf("%d", &n2);
    head2 = createPolynomial(n2);
    PolynomialList result = multiplyPolynomialLists(head1, head2);
    printPolynomial(result);
    // 释放内存
    PolynomialList p;
    while (head1) {
        p = head1;
        head1 = head1->next;
        free(p);
    }
    while (head2) {
        p = head2;
        head2 = head2->next;
        free(p);
    }
    while (result) {
        p = result;
        result = result->next;
        free(p);
    }
    return 0;
}
一元多项式运算器——求值
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

int main() {
    int numElements;
    int* arrayData = (int*)malloc(100 * 3 * sizeof(int));
    scanf("%d", &numElements);
    getchar();
    for (int i = 1; i <= numElements; i++) {
        scanf("(%d,%d)", &arrayData[i * 3 - 2], &arrayData[i * 3 - 1]);
    }
    int valueToEvaluate;
    scanf("%d", &valueToEvaluate);

    int result = calculateValue(arrayData, numElements, valueToEvaluate);
    printf("%d\n", result);

    free(arrayData);

    return 0;
}

int calculateValue(int* data, int numElements, int value) {
    int sum = 0;
    for (int i = 1; i <= numElements; i++) {
        sum += data[i * 3 - 2] * pow(value, data[i * 3 - 1]);
    }
    return sum;
}
一元多项式运算器——求导
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

typedef struct Term {
    int coefficient;
    int exponent;
    struct Term* next;
} Term;

Term* createTerm(int coefficient, int exponent) {
    Term* newTerm = (Term*)malloc(sizeof(Term));
    newTerm->coefficient = coefficient;
    newTerm->exponent = exponent;
    newTerm->next = NULL;
    return newTerm;
}

void addTerm(Term** polynomial, int coefficient, int exponent) {
    Term* newTerm = createTerm(coefficient, exponent);
    if (*polynomial == NULL) {
        *polynomial = newTerm;
    } else {
        Term* current = *polynomial;
        while (current->next!= NULL) {
            current = current->next;
        }
        current->next = newTerm;
    }
}

void printPolynomial(Term* polynomial) {
    int isFirstTerm = 1;
    while (polynomial!= NULL) {
        if (polynomial->coefficient == 0) {
            polynomial = polynomial->next;
            continue;
        }
        if (!isFirstTerm && polynomial->coefficient > 0) printf("+");
        isFirstTerm = 0;
        printf("%d", polynomial->coefficient);
        if (polynomial->exponent == 0) {
            printf("");
        } else if (polynomial->exponent == 1) {
            printf("X");
        } else {
            printf("X^%d", polynomial->exponent);
        }
        polynomial = polynomial->next;
    }
    if (isFirstTerm) {
        printf("0");
    }
    printf("\n");
}

int main() {
    int n;
    scanf("%d", &n);
    getchar();

    Term* polynomial = NULL;
    for (int i = 1; i <= n; i++) {
        int coefficient, exponent;
        scanf("(%d,%d)", &coefficient, &exponent);
        coefficient *= exponent;
        exponent--;
        addTerm(&polynomial, coefficient, exponent);
    }

    printPolynomial(polynomial);

    // Free memory
    Term* current = polynomial;
    while (current!= NULL) {
        Term* next = current->next;
        free(current);
        current = next;
    }

    return 0;
}
约瑟夫环(Josephus)问题
#include <stdio.h>
#include <stdlib.h>

typedef struct node {
    int value;
    int index;
    struct node* next;
} LNode, *LinkList;

LinkList createLinkedList(int count) {
    int i;
    LNode* newNode;
    LNode* rear = NULL;
    LinkList listHead = (LinkList)malloc(sizeof(LNode));
    rear = listHead;
    for (i = 1; i <= count; i++) {
        newNode = (LinkList)malloc(sizeof(LNode));
        scanf("%d", &newNode->value);
        newNode->index = i;
        rear->next = newNode;
        rear = newNode;
    }
    rear->next = NULL;
    return listHead;
}

int main() {
    int numCount = 0;
    int initValue = 0;
    scanf("%d %d", &numCount, &initValue);
    LinkList head = createLinkedList(numCount);
    LinkList currNode = head;
    LinkList removed;
    for (int i = 1; i <= numCount; i++) {
        for (int j = 1; j < initValue; j++) {
            currNode = currNode->next;
            if (currNode->next == NULL) {
                currNode = head;
            }
        }
        removed = currNode->next;
        initValue = removed->value;
        printf("%d ", removed->index);
        if (removed->next == NULL) {
            currNode->next = head->next;
        } else {
            currNode->next = removed->next;
        }
        free(removed);
    }
    return 0;
}
约瑟夫(Josephus)排列问题Step1
#include <stdio.h>
#include <stdlib.h>

typedef struct person {
    int id;
    struct person* next;
} PersonNode, *PersonList;

int main() {
    PersonList groupHead = malloc(sizeof(PersonNode));
    groupHead->next = groupHead;
    PersonList prevPerson = groupHead;
    int numPeople, initialPassword;
    scanf("%d%d", &numPeople, &initialPassword);

    for (int i = 1; i <= numPeople; i++) {
        PersonList newPerson = malloc(sizeof(PersonNode));
        prevPerson->next = newPerson;
        newPerson->id = i;
        newPerson->next = groupHead;
        prevPerson = newPerson;
    }

    PersonList currPerson = groupHead->next;
    prevPerson = groupHead;

    while (groupHead->next!= groupHead) {
        int count = 0;
        while (count < initialPassword - 1) {
            if (currPerson->next == groupHead) {
                currPerson = currPerson->next;
                prevPerson = prevPerson->next;
            }
            currPerson = currPerson->next;
            prevPerson = prevPerson->next;
            count++;
        }
        if (currPerson->next == groupHead) {
            printf("%d ", currPerson->id);
            prevPerson->next = groupHead;
            prevPerson = groupHead;
            PersonList temp = currPerson;
            currPerson = groupHead->next;
            free(temp);
        } else {
            printf("%d ", currPerson->id);
            prevPerson->next = currPerson->next;
            PersonList temp = currPerson;
            currPerson = currPerson->next;
            free(temp);
        }
    }
    return 0;
}
约瑟夫(Josephus)排列问题Step2
#include <stdio.h>
#include <stdlib.h>

typedef struct node {
    int number;
    struct node *next;
} Node, *List;

// 全局变量定义
List head = NULL;
List pFront = NULL;
List per = NULL;
int n, m;
int b[100];
int k;

// 创建循环链表函数
void Create();

// 约瑟夫环问题求解函数
void Joseph(int number, int m);

int main() {
    scanf("%d %d", &n, &m);
    int i;
    int a[n];
    for (i = n - m; i < n; i++) {
        scanf("%d", &a[i]);
    }
    for (i = 1; i <= n; i++) {
        head = NULL;
        pFront = NULL;
        k = 0;
        int flag = 1;
        Create();
        per = head;
        Joseph(n, i);
        for (int j = n - m; j < n; j++) {
            if (a[j]!= b[j]) {
                flag = 0;
                break;
            }
        }
        if (flag == 1) {
            printf("%d", i);
            return 0;
        }
    }
    return 0;
}

// 创建循环链表
void Create() {
    List tail = NULL;
    for (int i = 0; i < n; i++) {
        List pnew = (List)malloc(sizeof(Node));
        pnew->number = i + 1;
        if (head == NULL) {
            head = pnew;
            tail = pnew;
        } else {
            tail->next = pnew;
            tail = pnew;
        }
    }
    tail->next = head;
    pFront = tail;
}

// 解决约瑟夫环问题
void Joseph(int number, int m) {
    if (number == 0) {
        return;
    }
    int count = 1;
    List p = NULL;
    while (count!= m) {
        per = per->next;
        pFront = pFront->next;
        count++;
    }
    p = per;
    pFront->next = per->next;
    if (number == 1) {
        b[k++] = p->number;
    } else {
        b[k++] = p->number;
    }
    per = per->next;
    free(p);
    Joseph(number - 1, m);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值