4-2 多项式求值 (15分) PTA

本文介绍了一个计算多项式在特定点的值的函数,并提供了两种不同的实现方式。一种使用了嵌套循环,时间复杂度为O(n²),另一种进行了优化,时间复杂度降低到了O(n)。通过对比,展示了如何通过简单的代码调整来显著提高程序效率。

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

本题要求实现一个函数,计算阶数为n,系数为a[0] ... a[n]的多项式f(x)=\sum_{i=0}^{n}(a[i]\times x^i)f(x)=i=0n(a[i]×xi) 在x点的值。

函数接口定义:

double f( int n, double a[], double x );

其中n是多项式的阶数,a[]中存储系数,x是给定点。函数须返回多项式f(x)的值。

裁判测试程序样例:

#include <stdio.h>

#define MAXN 10

double f( int n, double a[], double x );

int main()
{
    int n, i;
    double a[MAXN], x;
				
    scanf("%d %lf", &n, &x);
    for ( i=0; i<=n; i++ )
        scanf(“%lf”, &a[i]);
    printf("%.1f\n", f(n, a, x));
    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

2 1.1
1 2.5 -38.7

输出样例:

-43.1



思路:我感觉一个初学者如果能想出来的话,肯定是嵌套的for循环 ,程序在下面。程序本身应该是没错的,但是时间复杂度是O(n2),所以第三个测试样例没通过,运行超时。这就要求你去优化,想出用时更小的代码。(关于时间复杂度我也只是略懂一点0.0)

程序一:

时间复杂度 O(n2)

double f( int n, double a[], double x )
{
double sum = 0.0;
for(int i = 0;i<=n;i++){
double b = 1.0;

if(i == 0) {
b = 1.0;


}
else{
for(int j = 1;j<= i;j++){
b *= x;
}

}
sum = sum + a[i]*b;
}
return sum;
 } 


程序二:

时间复杂度 O(n)


double f( int n, double a[], double x )
 {
  int i;    
    double b=1.0;    
    double sum=a[0];  
    for(i=1;i<=n;i++)    
    {     
         b=b*x;    
         sum=sum+b*a[i];     
    }    
    return sum;    
 }

### 多项式加法 PTA 实现方法 在解决多项式加法问题时,可以采用链表或者数组来存储多项式的每一项。以下是基于引用中的描述和标准实现的方法。 #### 数据结构设计 为了高效处理多项式加法操作,通常会选用 **链表** 或者 **哈希表** 来存储多项式的各项。这里推荐使用链表的方式,因为其能够方便地按照指数递减顺序排列并动态扩展节点。 每个节点包含两项信息: - `coefficient` (系数) - `exponent` (指数) 通过遍历两个多项式对应的链表,按相同指数相加的原则完成加法计算。 --- #### 输入解析逻辑 根据题目要求,输入为两行,每行依次表示一个多项式的信息。具体如下: 1. 首先读取第一个整数 $ n $ 表示该多项式的项数。 2. 接下来连续读入 $ n $ 对整数 $(a_i, b_i)$ ,其中 $ a_i $ 是系数,$ b_i $ 是指数。 3. 将这些数据存入链表或其他合适的数据结构中以便后续处理。 对于本题而言,建议将所有输入统一整理成有序列表形式后再执行下一步骤的操作。 --- #### 加法规则说明 当对两个多项式进行加法运算时,遵循以下原则: - 如果当前两项具有相同的指数,则将其对应系数相加;如果结果不为零,则保留该项; - 若某一项仅存在于其中一个多项式里,则直接复制到最终的结果集中即可。 注意,在实际编码过程中还需要考虑特殊情况——即可能出现整个表达式简化后的值全为零的情况,此时需特别输出 “0 0”。 --- #### Python 示例代码实现 下面提供了一个完整的Python版本解决方案作为参考: ```python class Node: def __init__(self, coefficient=0, exponent=0): self.coefficient = coefficient self.exponent = exponent self.next = None def create_polynomial(): """创建多项式""" data = list(map(int, input().split())) head = current = Node() for i in range(data[0]): coef, exp = data[i * 2 + 1], data[i * 2 + 2] new_node = Node(coef, exp) current.next = new_node current = new_node return head.next def add_poly(poly_a, poly_b): """多项式加法""" dummy_head = current = Node() while poly_a and poly_b: if poly_a.exponent > poly_b.exponent: current.next = Node(poly_a.coefficient, poly_a.exponent) poly_a = poly_a.next elif poly_a.exponent < poly_b.exponent: current.next = Node(poly_b.coefficient, poly_b.exponent) poly_b = poly_b.next else: sum_coef = poly_a.coefficient + poly_b.coefficient if sum_coef != 0: current.next = Node(sum_coef, poly_a.exponent) poly_a = poly_a.next poly_b = poly_b.next current = current.next # 添加剩余部 if poly_a: current.next = poly_a if poly_b: current.next = poly_b return dummy_head.next def output_poly(polynomial): """打印多项式""" result = [] flag = False node = polynomial while node: if not flag: flag = True else: result.append(&#39; &#39;) result.extend([str(node.coefficient), str(node.exponent)]) node = node.next if not flag: print("0 0") else: print("".join(result)) if __name__ == "__main__": poly_a = create_polynomial() # 创建第一个多项式 poly_b = create_polynomial() # 创建第二个多项式 res_poly = add_poly(poly_a, poly_b) # 计算加法结果 output_poly(res_poly) # 打印结果 ``` 上述程序实现了从输入、构建链表、执行加法到最后输出的一系列功能[^4]。 --- #### 注意事项 1. 当前方案假设输入均合法合规,未额外加入错误检测机制。 2. 结果输出严格遵照无多余空白字符的要求。 3. 特殊情况如完全抵消后得到零多项式已妥善处理。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值