(3) 在fun函数中输入测试数据,编译,执行,该题函数返回void则无需return语句,出
现下图结果。执行时必须输入两个整型数:格式必须为17,5两个数终将要加一个逗号。执行结果中必须出现“Press any key to continue”字样才会生成out.dat文件,都则将不生成该文件。
(4) 打开in.dat。
fscanf(rf, \表示从in.dat中输入两个数给变量m和n,以第一行为例将101给了m,将7给了n,即找出101后面的7个素数放在out.dat中。
(5) 打开out.dat。
for( m = 0 ; m < n ; m++ ) fprintf(wf, \将m个素数以%d 的形式输出,注意%d后面有一个空格,输出的时候要原样输出。根据in.dat中的第一行数据我们可以知道101后面的7个素数为:103 107 109 113 127 131 137,计算的时候多带几个数字进去就行,一般个位出现1,3,5,7,9都很难被其它的数字整除。
第十一种类型:数学问题三,公式类型
1. 考题中对应题目编号:6、11、14、34、48、49、67、73、76、89、91,该类型题目如果使用特
殊方法做题,将不变的复杂,因此该类型题目只能使用编程的方法来执行。 2. 考题6和73题一样,题目要求:根据公式求pi的值,要求精度满足0.0005,即某项小于0.0005
时停止迭代
观察表达式,左边求出的是pi的值的一半,所以右边的表达式的值的计算好后应该乘以2才能得到pi的值,观察表达式的右边 ,右边表达式中有分子、分母以及各表达式的值的和,分子是阶乘、分母是奇数项的积,分子除以分母得到一项的值。由此定义三个变量:s1代表分子,s2代表分母、s3代表各项的和,定义一个整型变量i,让变量i从1开始。知道循环的结束。
(1) 将下面的代码写入fun函数体中
(2) 编译,执行函数
(3) 执行过程时输入测试数据0.0005,最后输出PI的值为3.14?..为正确的结果,交卷
即可
注意:此题目中要特别注意,循环语句的表达式2的判断条件是s1/s2>=eps,而不是i<=n,循环语句的语句的顺寻不能颠倒,即先加之后再计算。
3. 考题11,题目要求:求出能整除形参x且不是偶数的各个整数,并从小到大的顺序放在pp所
指的数组中,这些除数的个数通过形参n返回。
此题中要求能整除x,那么x应该为分子,而不是分母,把满足条件的数组放到pp所指的数组中,即pp数组应用一个整型的变量来做pp下标,数组下标从0开始,所以定义一个整形变量k并且赋初值为0;满足条件的个数通过形参传回。
(1) 在fun函数中输入代码:
(2) 编译运行程序,输入测试数据35,输出1,5,7,35就说明正确,交卷即可
备注:此题目中不能把i初值定义为0,否则程序运行时得不到结果。
4. 考题14:求小于形参n能同时被3和7同时整除的所有自然数之和的平方根。67题和14题类
似。
首先看清题意,题目中要求是小于形参n,不包括n,能被3与7整除,两者用逻辑与连接,平方根用平方根的函数sqrt;此题中要求的是自然数的和的平方根,而不是平方根的和,所以要先把满足条件的数加起来后再开方。定义一个整型变量i,让该变量由1直到n-1,用循环实现,一个整形变量s,让该变量存放的是满足条件的数的和,由于s为全局变量,故应该赋初值为0;
int i,s=0;
for(i=1;i if(i%3==0&&i%7==0) s+=i; return sqrt(s); 5. 34、观察表达式,表达式的分子为x的n次冥,分母为数字的阶乘,s为表达式的累加和,定义 三个变量s1为分子 ,s2为分母,s为分子除以分母的和。 float s1=1.0,s2=1.0,s=1.0; int i; for(i=1;i<=n;i++) { s1*=x; s2*=i; s+=s1/s2; } return s; 备注:此时s的值不能赋初值为0;如果s得初值为0,此时表达式的值中没有第一项的值。并且必须用return返回。 6. 48、该表达式的分子均为1,分母为该项和下一项的积,s为最后表达式的累加和,定义一个整 形变量I,用于代表某一项的序号,则i+1到表达的是下一项的序号。 float s=0.0; int i; for(i=1;i<=n;i++) s+=1.0/(i*(i+1)); return s; 备注: 分子为1.0,而不能是1;因为c语言中规定,整型除以整型,得到的值仍然为整型,。 i+1必须用括号括起来,如果没有用括号括起来,根据乘法运算规则,则先运算i*i,再运算i*i+1的值。 7. 49、在该表达式中,分子分母都是阶乘,可以看做是三个数之间的运算,其中的每一个数都是 另外一个数的阶乘,定义三个变量,其中s1代表的是m的阶乘,s2代表的n的阶乘,s3代表的是m-n的阶乘,表达式的值可以计算为:s1/(s2*s3); 三个变量都是代表的是阶乘,所以在赋初值时应该赋初值为1或者是1.0; float s1=1.0,s2=1.0,s3=1.0; int i; for(i=1;i<=m;i++) s1*=i; for(i=1;i<=n;i++) s2*=i; for(i=1;i<=m-n;i++) s3*=i; return s1/(s2*s3); 8. 67、题目要求:求出1到1000之间能被7或11整除,但不能同时被7和11整除的所有的整数。 分析题目可以知道求出1到1000之间的数字必须使用循环,起始值为1,终止值为1000,否则太复杂,不能同时被7和11整除即时不能被7和11的乘积77整除,最后通过n返回满足条件的个数。 程序如下,经过编译执行后得到的结果如下: 9. 76、 分析题目知道F(0)和F(1)是两个初始值为0和1,假设F(0)为变量a,F(1)为变量1,假设F(n)为c,则: a=0,b=1; F(3)=F(2)+F(1)即:F(3)=b+a=1 即:c=b+a F(4)=F(3)+F(2)即:F(4)=(b+a)+b=2 即:c=(b+a)+b 换种形式:c=b+a,即b的值应该为 上一步中c的值,a应该为上一步中b的值,依次类推即可使用循环来实现结果。 使用C语言编程时,必须给变量C赋值,题目中要求找出大于t的最小的数,话句话说就是当c的值小于等于t时就循环,一直找到大于t的最小数为止。程序如下,当执行编译、运行后程序输出f的值为1597就为正确的,否则需要再仔细检查代码。 10. 89、求出1到m之间各个数字ln(i)值的和的平方根。 分析: (1) 题目中要求计算1到m的ln(i),则必须使用循环,i从0开始到m结束,ln(i)在 C语言中必须改为log(i); (2) sum=sum+log(i)表示求出1到m的ln(i)的和 (3) return sqrt(sum)表示函数返回sum的平方根 (4) 程序输出6.506583时为正确结果 11. 91、 分析: (1) 观察计算公式可以知道,题目要求做的事情就是将1/1+1/(1+2)+?的和进行返回, 因此确定循环变量i的值必须从1开始,一直到n结束。 (2) 观察计算公式,分子不变都是1,分母是1到第i项的累加和,用t表示 (3) t=t+i;计算出分母 (4) s=s+1.0/t;计算出累加和,其中1.0/t必须要注意,不能写为1/t,这样就出错 (5) return s;返回累加和