第一题:
泰勒展开式求sin(x)
【问题描述】
已知sin(x)的泰勒展开式为:
sin(x) = x/1! - x^3/3! + x^5/5! - x^7/7! + ……
当某一项的绝对值小于ξ时,停止计算。
输入x及ξ的值,输出sin(x)的值,小数点后保留5位小数。
【输入形式】
1.7 0.1
【输出形式】
sin(x) = 0.99949
代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
double x,mi,jc=1,g,sshu,sum=0,h=2;
cin>>x>>g;
for(int i=1;;i=i+2)
{
mi = pow(x,i);
for(double j=2;j<=i;j++)
{
jc=jc*j;
}
sshu=mi/jc;
jc=1;
if((fabs(sshu))<(g))break;
sum=pow(-1,h)*(sshu)+sum;
h++;
}
cout<<"sin(x)="<<fixed<<setprecision(5)<<sum;
return 0;
}
第一题变式:
泰勒展开式求cos(x)
【问题描述】
已知cos(x)的泰勒展开式为:
cos(x) = x^0/0! - x^2/2! + x^4/4! - x^6/6! + ……
当某一项的绝对值小于ξ时,停止计算。
输入x及ξ的值,输出cos(x)的值,小数点后保留5位小数。
【输入形式】
1.7 0.1
【输出形式】
cos(x) = -0.09700
代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
double x,mi,jc=1,g,sshu,sum=0,h=2;
cin>>x>>g;
for(int i=0;;i=i+2)
{
mi = pow(x,i);
for(double j=1;j<=i;j++)
{
jc=jc*j;
}
sshu=mi/jc;
jc=1;
if((fabs(sshu))<(g))break;
sum=pow(-1,h)*(sshu)+sum;
h++;
}
cout<<"cos(x)="<<fixed<<setprecision(5)<<sum;
return 0;
}
本题主要知识点:
(1)灵活运用for循环(遇到break;跳出for循环)
for(int i=0;;i=i+2) // 遇到break;跳出循环
(2)绝对值函数
fabs();
(3)变号
int n=2;
pow(-1,h);
h++;
第二题:
.阶乘末尾0的个数
【问题描述】
输入正整数n(2<n<3000),输出n!末尾0的个数。
【输入形式】
5
【输出形式】
1
【输入形式】
25
【输出形式】
6
代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n, sum = 0, i, t;
scanf("%d", &n);
for(i = 5; i <= n; i += 5)
{t = i;
while(t % 5 == 0)
{
sum ++;
t /= 5;
}
}
printf("%d", sum);
return 0;
}
本题主要在于理解,代码很简单的 :
/*
n! = 1 * 2 * 3 * … * n
其中每个乘数可以分解为质因子的积,如4=2*2,15=3*5。
由此上式可以写成若干个质数的积,而在所有质数中,只有2*5=10,最终结果末尾会多加一个0。
而2出现的频率显然高于5出现的频率,所以,我们可以找到从1~n的每个数中,5作为因子的个数。
如15中包含一个5,最终结果里末尾0的个数加1,25包含2个5,最终结果里末尾0的个数加2。
*/
第二题变式:
阶乘的尾数
【问题描述】
输入正整数n(2<n<3000),输出n!最后不等于0的两位数。
【输入形式】
5
【输出形式】
12
【输入形式】
7
【输出形式】
04
代码:
#include <stdio.h>
int main()
{
int n, sum = 1, i;
scanf("%d", &n);
//计算n!最后不等于0的两位数,结果存于sum中。
for(i = 2; i <= n; i ++)
{
sum *= i;
while(sum % 10 == 0)
sum /= 10;
sum %= 100;
}
printf("%02d", sum);
return 0;
}
本题也是注意理解,代码很简单,理解题目非常重要
第三题:
打印右字母三角形
【问题描述】
输入一个正整数n(0<n<27),代表要打印图形的高度,要求打印出下列图形。
【输入形式】
3
【输出形式】
代码:
#include <stdio.h>
int main()
{
int n, i, j;
char c = 'A';
scanf("%d", &n);
for(i = 0; i < n; i ++)
{
c = 'A';
for(j = 0; j < n - i - 1; j ++)
printf(" ");
for(j = 0; j <= i; j ++)
printf("%c", c+j);
printf("\n");
}
return 0;
}
本题主要知识点:
(1)递减空格
for(j = 0; j < n - i - 1; j ++)
printf(" ");
递减时for循环中第一个条件为初始值(比较小),第二个条件为递减值,第三个条件x++
递增时for循环中第一个条件为初始值(比较小),第二个条件为递增值 ,第三个条件x++,x--时相反
(2)充分运用ascll码
char c = 'A';
c = 'A';
for(j = 0; j <= i; j ++)
printf("%c", c+j);
(3)还有一种方法,就是将A---Z 26个字母储存在数组中,然后输出。
第三题变式:
打印右字母三角形
【问题描述】
输入一个正整数n(0<n<27),代表要打印图形的高度,要求打印出下列图形。
【输入形式】
3
【输出形式】
代码:
#include <stdio.h>
int main()
{
int n, i, j;
char c = 'A';
scanf("%d", &n);
for(i = 0; i < n; i ++)
{
c = 'A';
for(j = 0; j < n - i; j ++)
printf("%c", c+j);
printf("\n");
}
return 0;
}
上半张试卷总结:
前几题不会太难,主要在于理解,写代码前分析清楚,思路找明白很重要。