在計算機等級考試二級C語言程式設計試題中,多項式求值是一個重要的考點,有關多項式求值的試題在歷年考試試卷的程式填空題和程式設計題中經常出現,
一.示例講解
1.求給定多項式的前n項之和,
這類題目中,給定了需要計算的多項式的項數n,并且各項通常可以用數學式表示出來,因此,程式通常寫成如下回圈:
for (i=1; i<=n; i++)
{
// 按各項的數學式求出當前第i項
// 將第i項累加到多項式和值上
}
例1 撰寫函式fun,它的功能是:計算序列 1 + 1/2 + 1/3 + ...的前N項之和,
例如,若n=10,函式值為:2.928968,
#include <stdio.h>
double fun(int n)
{
}
int main()
{
printf("%f\n", fun(10));
return 0;
}
決議:直接利用for回圈完成累加求和,
撰寫的fun函式如下:
double fun(int n)
{
double s=0;
int i;
for (i=1;i<=n;i++)
s=s+1.0/i; // 注意:不要寫成 1/i
return s;
}
例2 撰寫函式fun,它的功能是:計算簡單交錯序列
1 - 1/4 + 1/7 - 1/10 + ... 的前N項之和,
例如,若n=10,函式值為:0.818743,
#include <stdio.h>
double fun(int n)
{
}
int main()
{
printf("%f\n", fun(10));
return 0;
}
對于這種交錯序列的多項式求值,可以引入一個變數t用于表示正負號切換,初始時,t=1,每累加一項后,t=-t,這樣t的值在1、-1、1、-1、…序列中變換,正好和交錯序列加1項,減1項相符合,
撰寫的fun函式如下:
double fun(int n)
{
double s=0;
int i,t=1;
for (i=1;i<=n;i++)
{
s=s+t*1.0/(3*i-2);
t=-t;
}
return s;
}
例3 撰寫函式fun,它的功能是:計算

例如,若x=2.5,n=12,函式值為:12.182340,
#include <stdio.h>
double fun(double x, int n)
{
}
int main()
{
double x, y;
x=2.5;
y = fun(x, 12);
printf("\nThe result is :\n");
printf("x=%-12.6f y=%-12.6f\n", x, y);
return 0;
}
決議:在這個題目中,直接按每項的數學表示式求出該項的值不是一個可取的辦法,實際上若求得了第i項的值為t,則第i+1項的值為 t*x/(i+1),因此,可設t的初始值為 1,之后用回圈
for (i=1; i<=n; i++)
t *= x/i;
可依次求得第1項至第n項的值,
例如,i=1時,t*=x/1; t=1*x/1=x;
i=2時,t*=x/2; t=x*(x/2)=x2/2! ;
i=3時,t*=x/3; t= x2/2!*(x/3)= x3/3!;
……
撰寫的fun函式如下:
double fun(double x, int n)
{
double f, t;
int i;
f = 1.0;
t = 1.0;
for (i=1; i<n; i++)
{
t *= x/i;
f += t;
}
return f;
}
例4 撰寫函式fun,它的功能是:計算

例如,若x=2.5,n=15,函式值為:1.917915,
#include <stdio.h>
#include <math.h>
double fun(double x, int n)
{
}
int main()
{
double x, y;
x=2.5;
y = fun(x, 15);
printf("\nThe result is :\n");
printf("x=%-12.6f y=%-12.6f\n", x, y);
return 0;
}
決議:如同例3,直接由第i項的值t求得第i+1項,t的初始值設為-1.0,
撰寫的fun函式如下:
double fun(double x, int n)
{
double f, t;
int i;
f = 1.0;
t = -1;
for (i=1; i<=n; i++)
{
t *= (-1.0)*x/i;
f += t;
}
return f;
}
2.求給定精度的多項式的值,
在這類題目中,通常組成多項式的各項是一個收斂序列,要求計算多項式的值,直到最后一項的絕對值小于給定的精度值eps,程式寫成
// 置多項式的初始值,并按要求置初始的當前項item
while (fabs(item)>=eps)
{
// 累加當前項item
// 按多項式各項表示式求出下一項,作為新的當前項item
}
也可以寫成
// 置多項式的初始值,并按要求置初始的當前項item
do
{
// 累加當前項item
// 按多項式各項表示式求出下一項,作為新的當前項item
} while (fabs(item)>=eps);
例5 撰寫函式fun,它的功能是:計算序列部分和
1 - 1/4 + 1/7 - 1/10 + ...
直到最后一項的絕對值不大于給定精度eps,
#include <stdio.h>
#include <math.h>
double fun(double eps)
{
}
int main()
{
double e;
scanf("%lf", &e);
printf("sum = %.6f\n", fun(e));
return 0;
}
撰寫的fun函式如下:
double fun(double eps)
{
int t=1, i=1;
double sum=0,p=1.0;
if (eps>=1)
return p;
else
{
while (fabs(p)>eps)
{
p=t*1.0/i;
sum=sum+p;
i+=3;
t=-t;
}
return sum;
}
}
例6 撰寫函式fun,它的功能是:計算

直到|xn/n!|<10-6,
例如,若x=2.5,函式值為:12.182494,
#include <stdio.h>
#include <math.h>
double fun(double x)
{
}
int main()
{
double x, y;
x=2.5;
y = fun(x);
printf("\nThe result is :\n");
printf("x=%-12.6f y=%-12.6f \n", x, y);
return 0;
}
決議:如同例3,直接由第i項的值t求得第i+1項,
撰寫的fun函式如下:
double fun(double x)
{
double f, t;
int n;
f = 1.0+x;
t = x;
n = 1;
do {
n++;
t *= x/n;
f += t;
}while (fabs(t) >= 1e-6);
return f;
}
例7 撰寫函式fun,它的功能是:計算

直到|xn/n!|<10-6,
例如,若x=2.5,函式值為:1.917915,
#include <stdio.h>
#include <math.h>
double fun(double x)
{
}
int main()
{
double x, y;
x = 2.5;
y = fun(x);
printf("\nThe result is :\n");
printf("x=%-12.6f y=%-12.6f\n", x, y);
return 0;
}
決議:結合例4和例6的思路,將例6中的t *= x/n;簡單修改為 t *= (-1.0)*x/n; 即可,
撰寫的fun函式如下:
double fun(double x)
{
double f, t;
int n;
f = 1.0 + x;
t = x;
n = 1;
do {
n++;
t *= (-1.0)*x/n;
f += t;
} while (fabs(t)>= 1e-6);
return f;
}
例8 撰寫函式fun,它的功能是:用下列公式求cos(x)的近似值,精確到最后一項的絕對值小于e:

例如,若e=0.01,x=-3.14,則函式值為-0.999899,
#include <stdio.h>
#include <math.h>
double fun(double e,double x)
{
}
int main()
{
double e, x;
scanf("%lf %lf", &e, &x);
printf("cos(%.2f) = %.6f\n", x, fun(e, x));
return 0;
}
撰寫的fun函式如下:
double fun(double e,double x)
{
double cos=1.0,t=1.0;
int n=0;
while (fabs(t)>=e)
{
t=(-1)*t*x*x/((n+1)*(n+2));
cos+=t;
n+=2;
}
return cos;
}
3.給定的多項式序列各項用文字描述,
在這類題目中,給定的多項式序列的各項無法用一個數學運算式精確表示,通常用文字進行描述,例如,求1000以內所有的質數的和,
例9 撰寫函式fun,它的功能是:計算n(包括n)以內能被5或9 整除的所有自然數的倒數之和,
例如,在主函式中輸入n為20,則輸出為:s=0.583333,
#include <stdio.h>
double fun(int n)
{
}
int main()
{
int n;
double s;
printf("\nInput n: ");
scanf("%d",&n);
s=fun(n);
printf("\ns=%f\n",s);
return 0;
}
決議:程式寫成一重回圈for (i=1;i<=n;i++),回圈體中,對每個整數i進行判斷,如果i能被5或9 整除,則累加i的值,
撰寫的fun函式如下:
double fun(int n)
{
double s=0.0;
int i;
for (i=1;i<=n;i++)
if (i%5==0 || i%9==0)
s+=1.0/i;
return s;
}
例10 撰寫函式fun,它的功能是:求s= a +aa+aaa +… +aa..aa(此處aa..aa表示n個a,a和n的值在1至9之間),
例如,a=3,n=5,則以上運算式為:s=3+33+333+3333+33333,其值是:37035,
#include <stdio.h>
int fun (int a, int n)
{
}
int main( )
{
int a, n ;
printf( "\nPlease enter a and n:") ;
scanf( "%d%d", &a, &n ) ;
printf( "The value of function is: %d\n", fun(a,n));
return 0;
}
決議:aa?a(n個a)可以看成由n-1個a乘以10加上a得到,初始時設t=0,每次回圈執行t=t*10+a,顯然,第1次回圈(i=1)時,t=0*10+a=a;第2次回圈(i=2)時,t=a*10+a=aa;…;第n次回圈(i=n)時,t= aa?a(n-1個a)*10+a= aa?a(n個a),
撰寫的fun函式如下:
int fun (int a, int n)
{
int i,s=0, t=0 ;
for (i = 1 ; i<=n ; i++)
{
t = t*10+a;
s = s + t ;
}
return(s) ;
}
二.程式設計練習題
1. 撰寫函式fun,它的功能是:計算下列級數和

例如,當n=10時,函式值為 0.909091,
#include <stdio.h>
double fun(int n)
{
}
int main()
{
printf("%f\n", fun(10));
return 0;
}
double fun(int n) { double s=0; int i; for (i=1;i<=n;i++) s+=1.0/(i*(i+1)); return s; }參考程式
2. 撰寫函式fun,它的功能是:計算

例如,在主函式中從鍵盤輸入8后,輸出為:s=0.662872,
#include <stdio.h>
double fun(int n)
{
}
int main()
{
int n;
double s;
printf("\nInput n: ");
scanf("%d",&n);
s=fun(n);
printf("\ns=%f\n",s);
return 0;
}
double fun(int n) { double s=0.0; int i,t=1; for (i=1;i<=2*n;i++) { s+=1.0*t/i; t=-t; } return s; }參考程式
3. 撰寫函式fun,它的功能是:求出以下分數序列的前n項之和,
2/1,3/2,5/3,8/5,13/8,21/13,……
例如,若n=5,則應輸出:8.391667,
#include <stdio.h>
double fun(int n)
{
}
int main( )
{
int n = 5 ;
printf("\nThe value of function is: %f\n", fun(n));
return 0;
}
double fun(int n) { int a = 2, b = 1, c, k ; double s=0.0 ; for ( k = 1; k <= n; k++ ) { s = s + 1.0 * a / b ; c = a+b; b=a; a=c; } return s ; }參考程式
4. 撰寫函式fun,它的功能是:計算并輸出下列級數的前N項之和SN,直到SN+1大于q為止,q的值通過形參傳入,
SN= 2/1+3/2+4/3+……+(N+1)/N
例如,若q的值為50.0,則函式值為49.394948,
#include <stdio.h>
double fun(double q)
{
}
int main()
{
printf("%f\n",fun(50.0));
return 0;
}
double fun(double q) { int n; double s,t; n=2; s=2.0; while (s<=q) { t=s; s=s+1.0*(n+1)/n; n++; } return t; }參考程式
5.撰寫函式fun,它的功能是:計算

例如,若m=20,函式值為:6.506583,
#include <stdio.h>
#include <math.h>
double fun(int m)
{
}
int main()
{
printf("%f\n", fun(20));
return 0;
}
double fun(int m) { double s=0.0; int i; for (i=1;i<=m;i++) s+=log(i); s=sqrt(s); return s; }參考程式
6. 撰寫函式fun,其功能是:根據以下公式計算S,計算結果作為函式值回傳,n通過形參傳入,

例如,若n=11,函式回傳值為1.833333,
#include <stdio.h>
float fun(int n)
{
}
int main()
{
int n;
float s;
printf("\nPlease enter N:");
scanf("%d", &n);
s = fun(n);
printf("the result is: %f\n", s);
return 0;
}
float fun(int n) { int i; float s=0,t=0; for (i=1;i<=n;i++) { t=t+i; s=s+1/t; } return s; }參考程式
7. 撰寫函式fun,它的功能是:計算

例如,n=20時,S=534.188884,
#include <stdio.h>
#include <math.h>
double fun(int n)
{
}
int main()
{
int n;
double s;
printf("\n\nInput n: ");
scanf("%d",&n);
s=fun(n);
printf("\ns=%f\n",s);
return 0;
}
double fun(int n) { double s=0.0,t=0.0; int i; for (i=1;i<=n;i++) { t=t+sqrt(i); s+=t; } return s; }參考程式
8. 撰寫函式fun,其功能是:計算下列多項式的值,

例如,若n=50,函式值為:1.718282,
#include <stdio.h>
double fun(int n)
{
}
int main()
{
int n;
double s;
printf("Input n: ");
scanf("%d",&n);
s=fun(n);
printf("\ns=%f\n",s);
return 0;
}
double fun(int n) { double s=0.0,t=1.0; int i; for (i=1;i<=n;i++) { t=t/i; s+=t; } return s; }參考程式
9. 撰寫函式fun,它的功能是:用下面的公式求π的近似值,直到最后一項的絕對值小于指定的數num為止,
π/4=1-1/3+1/5-1/7+…
例如,程式運行后,輸入0.0001,則程式輸出3.1414,
#include <stdio.h>
float fun(float num)
{
}
int main( )
{
float n1, n2 ;
printf("Enter a float number: ") ;
scanf("%f", &n1) ;
n2 = fun(n1) ;
printf("%6.4f\n", n2) ;
return 0;
}
float fun(float num) { int n,t ; float pi ; t = 1 ; pi = 0 ; n = 1 ; while (1.0/n >= num) { pi = pi + t*1.0/n ; n = n + 2 ; t = -t ; } pi = pi * 4 ; return pi ; }參考程式
10.撰寫函式fun,它的功能是:根據下列公式求π值,

例如,給定精度eps為0.0005時,應當輸出pi=3.140578,
#include <stdio.h>
double fun(double eps)
{
}
int main()
{
double x;
printf("\nPlease enter a precision: ");
scanf("%lf",&x);
printf("\neps=%f, Pi=%f\n",x,fun(x));
return 0;
}
double fun(double eps) { double s,t; int n=1; s=0.0; t=1.0; while( t>eps) { s+=t; t=t * n/(2*n+1); n++; } return (2*s); }參考程式
11.撰寫函式fun,它的功能是:計算并輸出給定10個數的方差,

例如,給定的10個數為95.0、89.0、76.0、65.0、88.0、72.0、85.0、81.0、90.0、56.0,輸出為s=11.730729,
#include <stdio.h>
#include <math.h>
double fun(double x[10])
{
}
int main()
{
double s, x[10]={95.0,89.0,76.0,65.0,88.0,72.0,85.0,81.0,90.0,56.0};
int i;
printf("\nThe original data is :\n");
for(i=0;i<10;i++) printf("%6.1f",x[i]);
printf("\n\n");
s=fun(x);
printf("s=%f\n",s);
return 0;
}
double fun(double x[10]) { double s,avg; int i; s=0.0; for (i=0;i<10;i++) s+=x[i]; avg=s/10; s=0.0; for (i=0;i<10;i++) s+=(x[i]-avg)*(x[i]-avg); s=sqrt(s/10); return s; }參考程式
12.撰寫函式fun,它的功能是:計算下列多項式的值

例如,當n=10時,輸出結果為:9.612558,
#include <stdio.h>
double fun(int n)
{
}
int main()
{
int n=-1;
while(n<0)
{
printf("Please input(n>0): ");
scanf("%d",&n);
}
printf("\nThe result is: %f\n",fun(n));
return 0;
}
double fun(int n) { int i; double s, t; s=0; for(i=1; i<=n; i++) { t=2.0*i; s=s+(t-1)*(t+1)/(t*t); } return s; }參考程式
13.撰寫函式fun,它的功能是:計算下列多項式的值

例如,當n=10時,輸出結果為:-0.204491,
#include <stdio.h>
double fun(int n)
{
}
int main()
{
int n;
scanf("%d",&n);
printf("\nThe result is: %f\n",fun(n));
return 0;
}
double fun(int n) { int i, k; double s, t; s=0; k=1; for(i=1; i<=n; i++) { t=2*i; s=s+k*(t-1)*(t+1)/(t*t); k=-k; } return s; }參考程式
14.撰寫函式fun,它的功能是:計算

例如,若形參e的值為1e-3,函式的回傳值為2.985678,
#include <stdio.h>
double fun(double e)
{
}
int main()
{
double e=1e-3;
printf("\nThe result is: %f\n",fun(e));
}
double fun(double e) { int i; double s, x; s=0; i=0; x=1.0; while(x>e) { i++; x=(2.0*i-1)/(( 2.0*i)*(2.0*i)); s=s+x; } return s; }參考程式
15.撰寫函式fun,它的功能是:計算

#include <stdio.h>
double fun(double e)
{
}
int main()
{
double e=1e-3;
printf("\nThe result is: %f\n",fun(e));
return 0;
}
double fun(double e) { int i, k; double s, t, x; s=0; k=1; i=2; x=3.0/4; while(x > e) { s=s+k*x; k=k*(-1); t=2*i; x=(t+1)/(t*t); i++; } return s; }參考程式
16.撰寫函式fun,它的功能是:計算當x<0.97時下列多項式的值,直到|S(n)-S(n-1)|<0.00001為止,

例如,在主函式中從鍵盤給x輸入0.21后,輸出為:S=1.100000,
#include <stdio.h>
#include <math.h>
double fun(double x)
{
}
int main()
{
double x,s;
printf("Input x: ");
scanf("%lf",&x);
s=fun(x);
printf("s=%f\n",s);
return 0;
}
double fun(double x) { int i=0; double s=1,t=1; while (fabs(t)>0.000001) { t=t*(0.5-i)*x/(i+1); s+=t; i++; } return s; }參考程式
17.撰寫函式fun,它的功能是:求s=aa..aa-…aaa-aa-a(此處aa..aa表示n個a,a和n的值在1至9之間),
例如,a=3,n=6,則以上運算式為:s=333333-33333-3333-333-33-3,其值是:296298,
#include <stdio.h>
long fun (int a, int n)
{
}
int main( )
{
int a, n ;
printf( "\nPlease enter a and n:") ;
scanf( "%d%d", &a, &n ) ;
printf( "The value of function is: %ld\n", fun(a,n));
return 0;
}
long fun (int a, int n) { int j ; long s = 0, t = 0 ; for ( j = 0 ; j < n ; j++) t = t * 10 + a ; s = t ; for ( j = 1 ; j < n ; j++) { t = t / 10 ; s = s - t ; } return(s) ; }參考程式
18.撰寫函式fun,它的功能是:求n以內(不包括n)同時能被3和7整除的所有自然數之和的平方根s,并作為函式值回傳,
例如,n=1000時,函式值應為:s=153.909064,
#include <stdio.h>
#include <math.h>
double fun(int n)
{
}
int main()
{
printf("s=%f\n",fun(1000));
return 0;
}
double fun(int n) { double s=0; int i; for (i=1;i<n;i++) if (i%3==0 && i%7==0) s+=i; s=sqrt(s); return s; }參考程式
19.撰寫函式fun,它的功能是:計算給定整數n的所有因子(不包括1和n自身)之和,規定n的值不大于1000,
例如,若n輸入的值為856,則輸出為:sum=763,
#include <stdio.h>
int fun(int n)
{
}
int main()
{
int n,sum;
printf("Input n: ");
scanf("%d",&n);
sum=fun(n);
printf("sum=%d\n",sum);
return 0;
}
int fun(int n) { int s=0,i; for (i=2;i<n;i++) if (n%i==0) s+=i; return s; }參考程式
20.已知一個數列從第0項開始的前三項分別為0,0,1,以后的各項都是其相鄰的前三項之和,給定程式中,函式fun的功能是:計算并輸出該數列前n項的平方根之和sum,
例如,當n=10時,程式的輸出結果應為:23.197745,
#include <stdio.h>
#include <math.h>
double fun(int n)
{
}
int main()
{
int n;
printf("Input N=");
scanf("%d", &n);
printf("%f\n", fun(n));
return 0;
}
double fun(int n) { double sum, s0, s1, s2, s; int k; sum = 1.0; if (n <= 2) sum = 0.0; s0 = 0.0; s1 = 0.0; s2 = 1.0; for (k = 4; k <= n; k++) { s = s0 + s1 + s2; sum += sqrt(s); s0 = s1; s1 = s2; s2 = s; } return sum; }參考程式
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/531912.html
標籤:其他
