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);
}