多项式求值

这篇博客介绍了如何处理多项式求值的问题。首先,输入包含一个整数m,表示多项式的项数,接着m行分别给出每项的系数c和次数e,最后是待求变量x0的值。博客将详细阐述计算过程并给出样例输入和输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

输入格式

输入的第一行为一个整数 mm1 \leq m < 181m<18),表示多项式共有 mm 项。之后输入 mm 行,每行有两个元素,分别表示多项式各项的系数 cc 与次数 ee1 \leq c_i < 1001ci<1001 \leq n < 251n<25)。最后一行为待求多项式的变量值 x_0x01 \leq x_0 < 51x0<5)。

输出格式

输出只有一行,即多项式的计算结果。结果保证在int范围内。

样例输入
3
1 2
2 1
1 0
3
样例输出
16
#include<iostream>
#include<cmath>
using namespace std;


typedef struct Vector {
	int size;
	int length;
	int *c;
	int *e;
}Vector;


void inint(Vector *vector, int size) {
	vector->size = size;
	vector->length = 0;
	vector->c = (int*)malloc(sizeof(int)*size);
	vector->e = (int*)malloc(sizeof(int)*size);
}
//用两个数组分别存放系数和指数


void expand(Vector *vector) {
	int *old_c = vector->c;
	int *old_e = vector->e;
	vector->size = vector->size + 1;
	vector->c = (int*)malloc(sizeof(int)*vector->size);
	vector->e = (int*)malloc(sizeof(int)*vector->size);
	for (int i = 0; i<vector->length; i++) {
		vector->c[i] = old_c[i];
		vector->e[i] = old_e[i];
	}
	free(old_c);
	free(old_e);
}


Vector *insert(Vector *vector, int loc, int coef, int expon) {
	if (loc<0 || loc>vector->length) {
		return vector;
	}
	if (vector->length >= vector->size) {
		expand(vector);
	}
	for (int i = vector->length; i>loc; i--) {
		vector->c[i] = vector->c[i - 1];
		vector->e[i] = vector->e[i - 1];
	}
	vector->c[loc] = coef;
	vector->e[loc] = expon;
	vector->length++;
	return vector;
}
//按照题目要求,插入的函数可以少一个loc参数。
//此处将程序写得更完整,虽然会在使用时稍显麻烦,但利于维护和修改。


int main()
{
	Vector *vector = (Vector*)malloc(sizeof(Vector));
	inint(vector, 18);
	int m;
	cin >> m;
	int coef, expon;
	for (int i = 0; i<m; i++) {
		cin >> coef >> expon;
		vector = insert(vector, vector->length, coef, expon);
	}


	int x;
	cin >> x;
	int answer = 0;
	for (int i = 0; i<vector->length; i++) {
		answer = answer + vector->c[i] * pow(x, vector->e[i]);
	}
	//这里求值采用的是直接一项一项地暴力求值,仍然测试通过,但理论上有更优算法。
	cout << answer << endl;


	/*for(int i=0;i<vector->length;i++){
	printf("c[%d]=%d e[%d]=%d\n",i,vector->c[i],i,vector->e[i]);
	}*/




	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值