c - 为什么我在 C 中得到关于霍纳规则的错误输出
问题描述
f(x) = a 0 + a 1 *x + a 2 *x 2 +...+a n *x n
首先,我创建一个动态数组来存储n的值。然后我定义了一个函数来描述霍纳规则,但是无论我改变输出的方式,我都会得到一个巨大的数字。代码有什么问题?
#include <stdio.h>
#include <malloc.h>
int f(int n, int *p, int x);
int main() {
int *pA;
int length;
int x;
int i;
printf("input the length of Array:"); ///createArray of 'An'
scanf("%d", &length);
printf("please input x = ");
scanf("%d", &x);
pA = (int *)malloc(4 * length);
for (i = 0; i < length; i++) {
printf("input the No.%d element:", i + 1);
scanf("%d", &pA[i]);
}
printf("%d\n", f(length, pA, x)); ///Horner's rule
return 0;
}
int f(int n, int *p, int x) {
int i;
int pn = p[n - 1];
for (i = n; i >= 1; i--) {
pn = p[i - 2] + x * pn;
}
return pn;
}
解决方案
给定多项式
f(x) = a 0 + a 1 x + a 2 x 2 + ... + a n x n
霍纳规则让我们用这个公式来评估它
f(x) = a 0 + x(a 1 + x(a 2 + ... x(a n -1 + xan ) ... ))
我们可以将其转换为递归公式并向后遍历系数数组。
f n = a n f i = a i + x⋅f i + 1
请记住,所述数组的实际大小将是n + 1并且有一个众所周知的习惯用法用于以这种方式遍历数组,该函数的可能实现可能如下。
double evaluate_poly_using_horner(size_t n, int const *c, double x)
{
if ( n == 0 )
return 0.0;
double result = c[n - 1];
for( size_t i = n - 1; (i--) > 0; )
{
result = c[i] + x * result;
}
return result;
}
这将解决 OP 代码中的问题,其中条件i >= 1
导致循环体执行到i == 1
,从而导致访问数组的边界p
(p[i - 2] = ...
变得p[-1] = ...
)。
另请注意,这些行
#include <malloc.h>
// ...
int *pA;
// ...
pA = (int *)malloc(4 * length);
// ^^^^^^^ ^
// ...
可以写成
#include <stdlib.h>
// ...
int *pA = malloc((sizeof *pA) * length);
if ( !pA ) {
// Deal with the failed allocation, maybe exit(1)
}
// ...
free(pA); // <- Don't leak memory!
推荐阅读
- sql - Postgresql 使用值更新
- swift - 如何使 CollectionViewCell 获取网格布局中较大单元格的高度
- video - ffmpeg:如何同时使用翻转、连接和加速多个视频?
- google-cloud-platform - GCP:缺少计算引擎默认服务帐号
- java - 扩展初始化驱动程序的 BaseClass 时出现 NullPointerException
- r - 使用 ncdf4 库的下标越界 使用 ncdf4 库
- amazon-web-services - Elastic Beanstalk 环境因以下有关 RDS 的错误消息而被阻止
- flutter - RangeError(开始):无效值:只有有效值是 0:-16 - FLUTTER
- python - 将表示二进制的字符串转换为二进制 JSON
- docker - 如何在没有外部 spark-submit 客户端的情况下使用 kubernetes 部署 Spark