秦九韶算法c语言
1. 求用秦九韶算法求多项式的程序
秦九韶算法
1.教学任务分析
(1)在学习中国古代数学中的算法案例的同(2)时,进一步体会算法的特点。(3)体会中国古代数学对世界数学发展的贡献。
2. 重点与难点重点:理解秦九韶算法的思想。难点:用循环结构表示算法步骤。
3.教学情境设计 (1) 设计求多项式f(x)=2x5-5x4-4x3+3x2-6x+7当x=5时的值的算法,并写出程序。
学生提出一般的解决方案,如:
x=5 f=2 * x^5 – 5 * x^4 – 4 * x^3 + 3 * x^2 – 6 * x + 7
PRINT“f=”;fEND
教师点评:上述算法一共做了解15次乘法运算,5次加法运算,优点是简单,易懂。缺点是不通用,不能解决任意多项式的求值问题,而且计算效率不高。
(2)有没有更高效的算法?
师:计算x的幂时,可以利用前面的计算结果,以减少计算量,即先计算x2,然后依次计算x2.x,(x2.x).x, ((x2.x).x).x的值,这样计算上述多项式的值,一共需要多少次乘法,多少次加法?
第二种做法与第一种做法相比,乘法的运算次数减少了,因而能提高运算效率,而且对于计算机来说,做一次乘法所需的运算时间比做一次加法要长得多,因此第二种做法更快地得到结果。
(3)能否探索更好的算法,解决任意多项式的求值问题?
教师引导学生把多项式变形为:f(x)= 2x5-5x4-4x3+3x2-6x+7
=((((2x-5)x-4)x+3)x-6)x+7
并提问:从内到外,如果把每一个括号都看成一个常数,那么变形后的式子中有哪些“一次式”?x的系数依次是什么?
(4)若将x的值代入变形后的式子中,那么求值的计算过程是怎样的?
师:计算的过程可以列表表示为:
多项式x系数
2
-5
-4
3
-6
7
运算
10
25
105
540
2670
+
变形后x的"系数"
2
5
21
108
534
2677
*5
最后的系数2677即为所求的值,让学生描述上述计算过程
师:指出这种算法就是“秦九韶算法”,同时介绍秦九韶的生平。
(5)用秦九韶算法求多项式的值,与多项式的组成有直接关系吗?用秦九韶算法计算上述多项式的值,需要多少次乘法运算和多少次加法运算?教师引导学生发现在求值的过程中,计算只与多项式的系数有关,让学生统计所进行的乘法和加法运算的次数。(6) 秦九韶算法适用一般的多项式f(x)=anxn+an-1xn-1+….+a1x+a0的求值问题吗?
师:怎样用秦九韶算法求一般多项式f(x)= anxn+an-1xn-1+….+a1x+a0当x=x0时的值?
教师引导学生思考,把n次多项式的求值问题转化成求n个一次多项式的值的问题,即求v1=anx+an-1
v2=v1x+an-2 v3=v2x+an-3 …….. vn=vn-1x+a0
的值的过程,共做了多少次乘法运算,多少次加法运算?
(7)怎样用程序框图表示秦九韶算法
观察秦九韶算法的数学模型,计算vk时要用到vk-1的值,若令v0=an,我们可以得到下面的递推公式:
v0=an vk=vk-1+an-k(k=1,2,…n)
这是一个在秦九韶算法中反复执行的步骤,可以用循环结构来实现。
(8)小结:通过对秦九韶算法的学习,你对算法本身有哪些进一步的认识?
教师引导学生思考、讨论、概括,小结时要关注如下几点:(1)算法具有通用的特点,可以解决一类问题;(2)解决同一类问题,可以有不同的算法,但计算的效率是不同的,应该选择高效的算法;(3)算法的种类虽多,但三种逻辑结构可以有效地表达各种算法;等等。
(9)课后作业:习题1.3A组第2题。
2. 这个C程序是写秦九韶算法的,为什么结果总是非常大的错误值,帮忙看看 #include <stdio
从代码看出你没弄明白算法是怎么计算的,你在看看,我帮你改了下
#include <stdio.h>
#include <stdlib.h>
void main()
{
int n;
double x , sum=0;
int *p;
int i;
printf("请输入x的值:");
scanf("%lf",&x);
printf("请输入参数个数:");
scanf("%d",&n);
p = (int *)malloc(n * sizeof(int));//定义动态数组判断创建是否成功
if(!p)
{
printf("内存创建失败。");
exit(0);
}
printf("请输入常数值:");
for(i=0;i<n;i++)//输入数组
{
scanf("%d",(p+i));
}
printf("输入常数为:");
for( i=0;i<n;i++){
printf("%d ",p[i]);
}
for(i=n-1;i>=0;i--)//计算值
{
sum=sum*x+p[i];
}
printf("算式的值为:%lf",sum);
}
运行结果如下:
3. 二进制转8421BCD码的算法
BCD码使用4位二进制数来表示十进制中0~9这10个数的数码。例如,十进制的237,其BCD码就是 0010_0011_0111 ,但是其二进制是 1110_1101 。
我们先来研究两个4位的BCD码相加的情况。设这两个BCD码对应的十进制是a,b,其中a,b∈{0,1,2,...,9}。此时只有3种情况:
也就是说:
第一种情况显然不需要再修正。
第二种情况,例如,5+8=13,我们希望得到BCD码是 0001_0011 ,但是运算结果 1101 ,因此如果我们加上了6,就可以得到正确结果: 1101 + 0110 = 0001_0011 。这是因为,十进制是逢十进一,但是4位BCD加法,在看作是二进制数做加法时,是逢十六进一。因此,如果结果是10≤a+b≤15,加上6以后就是16+0≤a+b+6≤16+5,此时因为逢十六进一的原因,就得到了结果 1_0≤[a+b+6]≤1_5 ,这个结果就是对的。
第三种情况,因为16≤a+b≤18,逢十六进一后,我们得到了 1_0≤[a+b]≤1_2 ,为了使结果正确,如果我们加上一个修正值6,就得到 1_6≤[a+b+6]≤1_8 ,从而结果也变得正确。
综上所述,如果两个BCD码相加:
考虑一个例子,比如 35+99=134。35和99的BCD码分别是 0011_0101 和 1001_1001 。先计算低4位: 0101 + 1001 = 1110 ,因为这个值大于9,因此加上6作为修正: 1110 + 0110 = 1_0100 。现在计算高四位,同时注意到还有一个进位: 0011 + 1001 + 0001 = 1101 ,这个值还是大于9,加上6,得到 1101 + 0110 = 1_0011 。因此最终结果是 1_0011_0100 ,这刚好就是134的BCD码。
我们之所以能够安全地加上进位,是因为BCD加法比照的就是十进制的加法,只不过前者是4位为一个单位,而后者是以1位数字作为一个单位。加上修正值后,BCD加法的进位就相当于十进制加法的进位。图示如下:
给定一个二进制数,要转BCD码。一个常用算法就是不断将该数除以10,以此依次分解出个位、十位、百位……上的数字,这些数字的4位二进制数就是对应的BCD。但是这样的算法需要不断做除法操作十分的麻烦。我们可以使用名为 加三左移法 来完成。
这个算法基于以下的事实:
一个n位二进制数 ,其展开是 如果使用秦九韶算法的嵌套形式写法,可以写成: 或者若令 则 如果使用这种形式,我们先计算的是 ,然后是 ,然后是 ,……,最后是 。
注意到 就是把 左移1位,这样就会在最右边空出一个位,之后再加 就是用 填充这个最低位,从而我们得到了 。不断左移,最终就能得到 ,现在我们来设计一个算法使得左移结束后能得到对应的BCD码。
设 是一个无限长的、初始状态为所有位都是0的理想寄存器, 是欲转换的数。我们使用下面的 归纳法 来构造证明我们通过不断左移最终能够得到存储在 中的 对应的BCD码:
由数学归纳原理,移动 len(h) 次后,我们最终可以得到 的BCD码。
作为一个例子,考虑使用该算法将 的二进制 1000_0110 转为BCD码:
现在, 已经全部移入,此时 的值就是 0001_0011_0100 ,它就是 的BCD码。
C语言的算法如下:
4. 编程实现:用秦九韶算法求多项式p(x)=3x^5-2x^3+x+7在x=3处的值
p(x)=3x^5+0x^4-2x^3+0x^2+x+7
=(3x^4+0x^3-2x^2+0x+1)x+7
=((3x^3+0x^2-2x+0)x+1)x+7
=(((3x^2+0x-2)x+0)x+1)x+7
=((((3x+0)x-2)x+0)x+1)x+7
v[1]=3x+0=9
v[2]=v[1]x-2=25
v[3]=v[2]x+0=75
v[4]=v[3]x+1=226
v[5]=v[4]x+7=685
如果你还有什么不懂的,可以网络搜下:编程回忆录,他们现在正在录制这方面的教程,都是零基础开始,由浅入深。
5. 用C语言编程实现秦九韶
/*修改n,n代表f(x)为n次多项式*/
#define n 5/*暂且设定为5*/
#include<stdio.h>
void main()
{
float a[n],x,sum;
int i;
printf("Please input the value of x=");
scanf("%f",&x);
for(i=n;i>=0;i--)
{
printf("Please input the value of a%d=",i);
scanf("%f",&a[i]);
}
sum=a[n];
for(i=n;i>=1;i--)
{
sum=sum*x+a[i-1];
}
printf("f(x)=%f\n",sum);
}
/*互相学习哈*/
6. 秦九韶法是典型的什么算法
其实我认为想让你回答的是递归算法。
理解这个算法的本质后你会这么想。(呵呵我算懂了吗?)
这个算法是这样的,将一个大规模的问题通过一步简化,化为一个稍小规模的问题,最后解决。你想想是不是这个道理。
这种算法一般我们叫它递归的。只是秦九韶算法有非递归实现。
类似的算法有快速排序,汉诺塔,归并排序等等。
7. 秦九韶算法的C++语言怎么表示
同学你好,我帮你实现了下!
#include<iostream>
#define N 3
using namespace std;
void main()
{
int a[N]; //N为多项式个数
int x; //x为变量值
int temp; //存储当前计算的值
for(int i=0;i<N;i++)
{
cout<<"请输入第"<<i+1<<"个系数"<<endl;
cin>>a[i]; //数组a[i]存放每一项的系数
}
temp=a[N-1];
cout<<"请输入x的值为"<<endl;
cin>>x;
for(int j=N-1;j>=1;j--)
{
temp=temp*x+a[j-1];//这个是迭代过程求多项式的值
}
cout<<"the result "<<temp<<endl;
}
8. 求C语言的解答
把一个n次多项式f(x) = a(n)×x^n + a(n – 1)x^n – 1 + …… + a(1)x + a(0),分拆成n个一次多项式:v(1) = a(n)x + a(n – 1)、v(2) = v(1)x + a(n – 2)、v(3) = v(2)x + a(n – 3)……v(n) = v(n – 1)x + a(0),这种算法叫做秦九韶算法。
float Polynomial(int n, int a[], float x0);
float y=a[n-1];
for(int i=n-1;i>=1;--i){
y=y*x0+a[i-1];
}
return y;
}