类型一 数列规律编程
1、编写函数fun,函数的功能是:根据以下公式计算s,计算结果作为函数值返回;n通过形参传入。
S=1+1/(1+2)+1/(1+2+3)+…+1/(1+2+3+…+n)
例如:若n的值为11时,函数的值为1.833333。
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
#include <string.h>
float fun(int n)
{
}
void main()
{
int n;
float s;
system("CLS");
printf("\nPlease enter N: ");
scanf("%d",&n);
s=fun(n);
printf("The result is:%f\n " , s);
}
【参考答案】
float fun(int n)
{
int i,s1=0;
float s=0.0;
for(i=1;i<=n;i++)
{s1=s1+i; /*求每一项的分母*/
s=s+1.0/s1; /*求多项式的值*/
}
return s;
}
【解析】本题中s1用来表示式中每一项的分母,而每一项的分母都是由前一项分母加项数。注意:由于s1定义成一个整型,所以在s=s+1.0/s1中不能把1.0写成1。
2、请编写一个函数fun,它的功能是:根据以下公式求π的值(要求满足精度0.005,即某项小于0.005时停止迭代)。
π/2=1+1/3+1*2/(3*5)+1*2*3/(3*5*7)+1*2*3*4/(3*5*7*9)+…+1*2*3*…*n/(3*5*7*…*(2n+1))
程序运行后,如果输入精度0.0005,则程序输出3.14…。
#include <stdio.h>
#include <conio.h>
#include <math.h>
double fun(double eps)
{
}
void main()
{
double x;
printf("Input eps: ");
scanf("%lf",&x);
printf("\neps=%1f,PI=%1f\n",x,fun(x));
}
【参考答案】
double fun(double eps)
{
double s=1.0,s1=1.0;
int n=1;
while(s1>=eps) /*当某项大于精度要求时,继续求下一项*/
{s1=s1*n/(2*n+1); /*求多项式的每一项*/printf函数具有计算功能吗
s=s+s1; /*求和*/
n++;
}
return 2*s;
}
【解析】从第2项开始以后的每一项都是其前面一项乘以n/(2*n+1),程序中用s1来表示每一项,s来表示求和后的结果。要注意s1和s的初值都为1.0,返回时要乘以2即return 2*s,这跟
数学思想有关系,学习者理解后就很简单了。
3、请编写函数fun,其功能是:计算并输出如下多项式值:
Sn=l+1/1!+1/2! +1/3! +1/4!+…+1/n!
例如,若主函数从键盘给n输入15,则输出为S=2.718282。
注意:n的值要求大于1但不大于100。部分源程序给出如下。
#include <stdio.h>
double fun(int n)
{
}
main ( )
{
int n;
double s;
printf("Input n:");
scanf("%d",&n);
s=fun(n);
printf("s=%f\n",s);
}
【参考答案】
double fun(int n)
{
double t,sn=1.0;
int i,j;
for(i=1;i<=n;i++)
{
t=1.0;
for(j=1;j<=i;j++)
t*=j;
sn+=1.0/t;
}
return sn;
}
【解析】该程序的数学思路是:在程序中输入n后,以前n项的阶乘作为分母递加,由于t是浮点类数据,所以s+=1.0/t,for循环的作用是每一次循环将1.0/t与sn相加,并将值存入sn中。
4、请编写函数fun,它的功能是:求Fibonacci数列中大于t(t>3)的最小数,结果由函数返回。其中Fibonacci数列F(n)的定义为:
F(0)=0,F(1)=1
F(n)=F(n-1)+F(n-2)
假如:当t=l000时,函数值为1597。
#include <conio.h>
#include <math.h>
#include <stdio.h>
int fun(int t)
{
}
main ( )
{
int n;
n=1000;
printf("n=%d,f=%d\n",n,fun(n));
}
【参考答案】
int fun(int t)
{
int a=1,b=1,c=0,i; /*a代表第n-2项,b代表第n-1项,c代表第n项,*/
for(i=4;i<=t;i++)
{
if(c<t) /*如果求得的数c比指定的数小,则计算下一个Fibonacci数,对a,b重新置数*/
{
c=a+b;a=b;b=c;
}
else
break; /*如果求得的数c比指定比较的数大时,退出循环*/
}
return c;
}
【解析】根据所给数列定义不难发现,该数列最终的结果是由两个数列之和组成,所以可以在循环内部始终把c看成是前两项之和,而a始终代表第n-2项,b代表第n-1项。退出循环时得到的数c,就是大于指定数的最小的数。
5、编写函数fun,它的功能是:计算和输出下列级数的和。
S=1/(1×2)+1/(2×3)+…+1/(n×(n+1))
例如,当n=10时,函数值为0.909091。
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
double fun(int n)
{
}
void main()
{
system("CLS");
printf("%f\n",fun(10));
}
【参考答案】
double fun(int n)
{
int i;
double s=0.0;
for(i=1;i<=n;i++)
s=s+1.0/(i*(i+1)); /*求级数的和*/
return s;
}
【解析】解决数学序列的问题,我们的思路依然是"数学先行",即先看清楚题目的数学逻辑,然后再用C语言"翻译"出来。本题中,每一项的值都是n*(n+1)的倒数。当输入n时,从1开始循环,注意,此处for(i=1;i<=n;i++)中的"="号必须要有,另外,表达式1.0/(i*(i+1))中的两对小括号一个都不能少。若写成1.0/i*(i+1)则相当于(i+1)/i,结果就差之千里了。
6、请编写函数fun,其功能是:计算并输出当x<0.97时如下多项式的值,直到|Sn-Sn-1|<0.000001为止。
例如,若主函数从键盘给x输入0.21后,则输出为s=1.100000。
#include <stdio.h>
#include <math.h>
double fun(double x)
{
}
main ( )
{
int i;
double x,s;
printf("Input x:");
scanf("%lf",&x);
s=fun(x);
printf ("s=%f\n",s);
}
【参考答案】
double fun(double x)
{
double s1=1.0,p=1.0,sum=0.0,s0,t=1.0;
int n=1;
do
{
s0=s1;
sum+=s0;
t*=n;
p*=(0.5-n+1)*x;
s1=p/t;
n++;
}while(fabs(s1-s0)>=1e-6);
return sum;
}
【解析】函数fun的功能是计算并输出当x<0.97时下列多项式的值。解答这类题,首先应该分析多项式的特点。 由于从第二项开始的所有项都能把分子与分母用两个表达式进行迭代,
因此可利用一个循环求和。
7、请编写函数fun,该函数的功能是:计算并输出
S=1+(1+20.5)+(1+20.5+30.5)+…+(1+20.5+30.5+…+n0.5)
例如,若主函数从键盘给n输入20后,则输出为s=534.188884。
#include <math.h>
#include <stdio.h>
double fun(int n)
{
}
void main()
{
int n;
double s;
printf("\n\nInput n: ");
scanf("%d",&n);
s=fun(n);
printf("\n\ns=%f\n\n",s);
}
【参考答案】
double fun(int n)
{
int i;
double s=0.0,s1=0.0;
for(i=1;i<=n;i++)
{s1=s1+pow(i,0.5); /*求每一项*/
s=s+s1; /*按公式求出s*/
}
return s;
}
【解析】我们先用数学的思路读懂该程序,并用1个字符表示"()"内的值。在本程序中用s1来表示题中每个小括号内的值,第1项相当于有1个10.5 (它还是1),第2项相当于第1项的值加上20.5,第3项相当于第2项的值加上30.5,…,依次类推。函数pow(x,y)的功能是求出x的
y次方,该函数已在库函数<math.h>中定义(即可直接使用)。程序中用s来表示总的结果,每1次循环加1次s1,即加1项。
8、请编写函数fun,其功能是:计算并输出下列多项式值。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论