一元多项式求和的两种实现(数组和链表)

一元多项式求和一般都是有两种实现方式,小编下面就附上我对这两种方式的理解和实现代码。

1.数组实现。这种方式实现一元多项式加法,是把数组下标当做一元多项式的指数,在数组中存放系数。这种方式在实现一元多项是加法是通过遍历数组下标来获取指数信息,通过指数信息将系数进行相加。利用数组在实现一元多项式加法,优点是操作简单,运算处理速度快,缺点是占用的内存大(此处内存大是指一开始所申请的内存计算机无法分配较大的连续内存)。

2链表实现。利用链表来实现一元多项式加法时,链表中要有指针域,两个数据域,一个存放指数,一个存放系数,它的优点是节省计算机内存(在指数a与一元多项式实际项数x x>(a+1)/3)(绝对内存)时,但操作复杂,计算机执行速度慢。

//头文件Array1
#pragma once
# include <iostream>
using namespace std;
void arraylist() {
	int m;
	int n;
	int alength1 = 0;
	int blength1 = 0;
	cout << "输入第一个一元多项式的最大指数:";
	cin >> m;
	cout << endl;
	cout << "输入第一个一元多项式的最大指数:";
	cin >> n;
	cout << endl;
	int alength = m + 1;
	int blength = n + 1;
	int *a = new int[alength] {0};
	int *b = new int[blength] {0};
	cout << "输入第一个一元多项式:(先输入指数再输入系数)" << endl;

	while (1) {
		//声明指数和系数
		//位置异常处理没写
		int exp = 0;
		int coef = 0;
		cin >> exp;
		if (exp == -1) {
			break;
		}
		else
		{
			cin >> coef;
			a[exp] = coef;
		}
	}
	cout << "输入第二个一元多项式:(先输入指数再输入系数)" << endl;
	while (1) {
		//声明指数和系数
		//位置异常没写
		int exp = 0;
		int coef = 0;
		cin >> exp;
		if (exp == -1)
			break;
		else {
			cin >> coef;
			b[exp] = coef;
		}

	}
	//获取一元多项式实际项数
	//alength1 = length1(a, alength);
	//blength1 = length1(b, blength);
	//数组实现的一元多项式加法函数调用
	arraylistadd(a, b, alength, blength);
	delete[]a;
	delete[]b;
	}
//获取一元多项式项数的函数
int length1(int a[], int length) {
	int length1 = 0;
	for (int i = 0; i < length; i++) {
		if (a[i] != 0)
			length1++;
	}
	return length1;
}


void arraylistadd(int a[], int b[],int alength,int blength) {
	if (alength >= blength) {
		for (int i = 0; i < blength; i++) {
			a[i] = a[i] + b[i];
		}
		cout << "输出结果(指数/系数):";
		for (int i = 0; i < alength; i++) {
			if(a[i]!=0)
			cout << i << " " << a[i] << " ";
		}
	}
	else {
		for (int i = 0; i < alength; i++) {
			b[i] = a[i] + b[i];
		}
		cout << "输出结果(指数/系数):";
		for (int i = 0; i < blength; i++) {
			if(b[i]!=0)
			cout << i << " " << b[i] << " ";
		}
	}
}




//头文件Linklist
#pragma once
# include <iostream>
using namespace std;
template < class  DataByte >
struct Node
{
	DataByte coef;
	int exp;
	Node<DataByte>* next;

};
template <class DataByte>
class Linklist {
	//操作链表的方法
public:
	Linklist();
	Linklist(DataByte a[], int n);
	void printList();
private:
	Node<DataByte>* first;

};



//头文件linklist1
#pragma once
# include <iostream>
# include "Linklist.h"
using namespace std;
template <class DataByte>
Linklist<DataByte>::Linklist() {
	first = new Node;
	r = first;
	cout << "先输入指数 再输入系数,指数为-1时结束输入:" << endl; 
	while (1) {
		s = new Node;
		int i;
		cin >> i;
		if (i ==-1 ) {
			break;
		}
		else {
			s->exp = i;
			int j;
			cin >> j;
			s->coef = j;
			r->next = s;
			r = s;
		}
	}
	r->next = null;
}
template <class  DataByte>
Linklist<DataByte>::Linklist(DataType a[],DataByte b[], int n) {
	first = new Node;
	r = first;
	for (int i = 0; i < n; i++) {
		s = new Node;
		s->exp = b[i];
		s->coef = a[i];
		r->next = s;
		r = s;
	}
	r->next = null;
}
template<class DataByte>
Linklist<DataByte>::printList() {
	p = first->next;
	while (p != null) {
		cout << p->exp << " " << p->coef << " ";
		p = p->next;
	}
}
template<class DataByte>
void Linklistadd(Linklist<DataByte> A, Linklist<DataByte> B) {
	Node<DataByte>*pre = A.first;
	Node<DataByte>*p = pre->next;
	Node<DataByte>*qre = B.first;
	Node<DataByte>*q = qre->next;
	while (p != null&&q != null) {
		if (p->exp < q->exp) {
			pre = p;
			p = p->next;
		}
		if (p->exp > q->exp) {
			Node<DataByte>*v = p->next;
			pre->next = q;
			q->next = p;
			q = v;
		}
		if (p->exp = q->exp) {
			p->coef = p->coef + q->coef;
			if (p->coef == 0) {
				pre->next = p->next;
				delete p;
				p = pre->next;
			}
			else {
				pre = p;
				p = p->next;
			}
			qre->next = q->next;
			delete q;
			q = qre->next;
		}
		if (q != null)
			pre->next = q;
		delete B.first;
	}

}






# include<iostream>
# include"Linklist.h"
# include "Linklist1.h"
# include "Array1.h"
using namespace std;
//主函数
int main() {
	int m;
	 cout<< "输入m:(m=1基于数组实现一元多项式加法 m=0 基于链表实现一元多项式加法)";
	cin >> m;
	if (m==1) {
		arraylist();
	}
	else {
		cout << "输入第一个一元多项式";
		Linklist<int> A;
		cout << "输入第二个一元多项式";
		Linklist<int> B;
		Linklistadd(A, B);
		A.printList();

	}
	return 0;
}

 

  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一元多项式加减乘除的C语言数组实现: 1. 定义一元多项式的结构体 ```c #define MAXN 1000 // 多项式最大项数 struct Polynomial{ int coef[MAXN]; // 系数数组 int exp[MAXN]; // 指数数组 int len; // 多项式项数 }; ``` 2. 初始化多项式 ```c void InitPoly(Polynomial &P){ memset(P.coef, 0, sizeof(P.coef)); // 初始化系数数组为 0 memset(P.exp, 0, sizeof(P.exp)); // 初始化指数数组为 0 P.len = 0; // 初始化项数为 0 } ``` 3. 多项式加法 ```c void AddPoly(Polynomial A, Polynomial B, Polynomial &C){ InitPoly(C); // 初始化结果多项式为 0 int i = 0, j = 0; while(i < A.len && j < B.len){ if(A.exp[i] > B.exp[j]){ // A 中指数较大 C.coef[C.len] = A.coef[i]; C.exp[C.len] = A.exp[i]; i++; } else if(A.exp[i] < B.exp[j]){ // B 中指数较大 C.coef[C.len] = B.coef[j]; C.exp[C.len] = B.exp[j]; j++; } else{ // 指数相等 C.coef[C.len] = A.coef[i] + B.coef[j]; C.exp[C.len] = A.exp[i]; i++; j++; } C.len++; } while(i < A.len){ // 将 A 中剩余项加入 C 中 C.coef[C.len] = A.coef[i]; C.exp[C.len] = A.exp[i]; i++; C.len++; } while(j < B.len){ // 将 B 中剩余项加入 C 中 C.coef[C.len] = B.coef[j]; C.exp[C.len] = B.exp[j]; j++; C.len++; } } ``` 4. 多项式减法 ```c void SubPoly(Polynomial A, Polynomial B, Polynomial &C){ InitPoly(C); // 初始化结果多项式为 0 int i = 0, j = 0; while(i < A.len && j < B.len){ if(A.exp[i] > B.exp[j]){ // A 中指数较大 C.coef[C.len] = A.coef[i]; C.exp[C.len] = A.exp[i]; i++; } else if(A.exp[i] < B.exp[j]){ // B 中指数较大 C.coef[C.len] = -B.coef[j]; // 系数取相反数 C.exp[C.len] = B.exp[j]; j++; } else{ // 指数相等 C.coef[C.len] = A.coef[i] - B.coef[j]; C.exp[C.len] = A.exp[i]; i++; j++; } C.len++; } while(i < A.len){ // 将 A 中剩余项加入 C 中 C.coef[C.len] = A.coef[i]; C.exp[C.len] = A.exp[i]; i++; C.len++; } while(j < B.len){ // 将 B 中剩余项加入 C 中 C.coef[C.len] = -B.coef[j]; // 系数取相反数 C.exp[C.len] = B.exp[j]; j++; C.len++; } } ``` 5. 多项式乘法 ```c void MulPoly(Polynomial A, Polynomial B, Polynomial &C){ InitPoly(C); // 初始化结果多项式为 0 for(int i = 0; i < A.len; i++) for(int j = 0; j < B.len; j++){ int k = A.exp[i] + B.exp[j]; C.coef[k] += A.coef[i] * B.coef[j]; // 累加系数乘积 } for(int i = 0; i < MAXN; i++) if(C.coef[i] != 0){ // 记录非零项 C.exp[C.len] = i; C.len++; } } ``` 6. 多项式除法 ```c void DivPoly(Polynomial A, Polynomial B, Polynomial &Q, Polynomial &R){ InitPoly(Q); // 初始化商多项式为 0 InitPoly(R); // 初始化余数多项式为 0 for(int i = A.len - 1; i >= 0; i--){ // 从高次项开始除 int k = A.exp[i] - B.exp[B.len - 1]; if(k < 0) break; // 除数次数超过被除数 int c = A.coef[i] / B.coef[B.len - 1]; // 计算系数 Q.coef[k] = c; // 存储商系数 Q.exp[Q.len] = k; // 存储商指数 Q.len++; for(int j = 0; j < B.len; j++){ // 减去被除数乘以商 int t = k + B.exp[j]; A.coef[i - B.len + j + 1] -= c * B.coef[j]; } } for(int i = A.len - 1; i >= B.len - 1; i--){ // 存储余数 if(A.coef[i] != 0){ R.coef[R.len] = A.coef[i]; R.exp[R.len] = A.exp[i]; R.len++; } } } ``` 以上就是一元多项式加减乘除的C语言数组实现。需要注意的是,在进行除法运算时,被除数必须是单项式,即只有一项,而除数可以是多项式。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值