由于本章节题目太多,我将分几次发布 实验02 分支与循环程序设计(2021级) 一. 程序题(共15题,100分) 1. (程序题)题目编号 :Exp02-Enhance02,GJBook3-04-0102
题目名称:公式累乘
题目描述:用如下的展开式计算当n为某给定值时,圆周率π的值。
输入:一个正整数n (n<=100000)
输出:一个浮点数,保留小数点后10位。
样例1:
输入:1000输出:3.1408077460样例2:
输入:10000输出:3.1415141187
这道求近似圆周率的题的原型即为求阶乘
#includeusing namespace std; int main()//求阶乘 { int x=1, sum=1; cin >> x; for (int y=1;y <= x;y++) { sum *= y; } cout << sum; return 0; }
本题的解法如下
#include#include using namespace std; int main() { int n; cin >> n; double sum=1; for (int k = 1;k <= n;k++) { sum *= (double) 2 * k / ( 2* k - 1) * 2 * k / (2 * k + 1); } cout << fixed << setprecision(10) << 2 * sum << endl; return 0; }
注意本题的几个小细节:
1.建议定义sum时使用double类型
2.结果为圆周率π,所以最后sum应该乘以2(仔细审题,避免临门一脚)
3.在for循环中求sum要加上(double)使表达式转化为双精度浮点型
4.使用包含
ps:有一些粗心的同学竟然发现自己最后的结果输出了一串0
这是因为变量定义的类型不对
int sum=1;
或者没有在for循环中求sum时加上(double)使表达式转化为双精度浮点型
for (int k = 1;k <= n;k++)
{
sum *= 2 * k / ( 2* k - 1) * 2 * k / (2 * k + 1);
}
还有一些同发现自己最后的结果过于离谱
这可能是因为在for循环中把n当成k来写了
for (int k = 1;k <= n;k++)
{
sum *= (double) 2 * k / ( 2* k - 1) * 2 * n / (2 * n + 1);
}
总之,一定要明确自己的目标,思路清晰,多注意细节
2. (程序题)题目编号 :Exp02-Basic11,GJBook3-04-03
题目名称:勒让德多项式
题目描述:
编一个程序,输入x、n,计算勒让德(Legendre)多项式的第 n 项(此题假定n取0时,为勒让德多项式第0项)。
输入:一个浮点数和一个整数,分别对应x和n(0<=n<=20)。
输出:一个浮点数,即勒让德多项式第n项的值,注意小数点后保留到第2位。
样例1:
输入:3.4 2输出:16.84样例2:
输入:3.4 10输出:30143685.82样例3:
输入:-3.4 2输出:16.84
这道题与第一题有异曲同工之妙,但稍微复杂了一点,体现了分支和循环结构
有些同学可能被直接劝退
闲话少叙,直接上代码
#include#include using namespace std; int main() { double x = 0, p = 1; int n = 0; cin >> x >> n; if (n == 0) cout << "1.00" << endl; else if (n == 1) cout << fixed << setprecision(2) << x << endl; else { double i = 1.00; double j = x; for (int k = 2;k <= n;k++) { p = (2.00 * k - 1.00) / k * x * j - (k - 1.00) / k * i; i = j; j = p; } cout << fixed << setprecision(2) << p << endl; } return 0; }
else里的for循环注意是在k=2时开始,不是从1开始
若最后的p结果与样例稍有出入,则要检查一下自己的表达式是否为正确形式
3. (程序题)
题目编号 :Exp02-Basic09,GJBook3例-04-10
题目名称:斐波纳契序列
问题描述:
开始,有一对小兔子。
一个月后,变成大兔子开始怀孕;
两个月后, 生出一对小兔子,这时共有两对兔子(一对大兔子, 一对小兔子), 同时大兔子又再次怀孕;
三个月后, 以前出生的小兔子变成大兔子,以前怀孕的大兔子又生出一对小兔子, 这时共有三对兔子(两对大兔子, 一对小兔子), 所有大兔子又全部怀孕;
四个月后, 以前出生的小兔子变成大兔子,以前怀孕的大兔子又各生出一对小兔子, 这时共有五对兔子(三对大兔子, 两对小兔子), 所有大兔子又全部怀孕;
五个月后, 以前出生的小兔子变成大兔子,以前怀孕的大兔子又各生出一对小兔子, 这时共有八对兔子(五对大兔子, 三对小兔子), 所有大兔子又全部怀孕;
…… ……
假设在兔子的生养过程中没有死亡。编程序,输入 n , 计算 n 个月后,有多少对兔子, 并输出。
提示:注意序列各项间的递推关系。
输入:一个非负整数n,表示月份(n≤91)
输出:n 个月后的兔子数(单位:对)
样例1:输入 0 输出 1
样例2:输入 1 输出 1
样例3:输入 2 输出2
样例4:输入10 输出89
递推数列,本人很喜欢用for循环,这个斐波那契用while循环也可以
关键就在中间部分的for循环处,揣摩一下这三个式子的关系。
for循环中m与n的关系要明确(为什么是"<")
因为m的初值为1,运算的次数为n-1,所以为"<"
#includeusing namespace std; int main() { int n; long long sum=1,x=1,y=1; cin >> n; for (int m = 1;m < n;m++) { sum = x + y; y = x; x = sum; } cout << sum << endl; return 0; }
同样的,这里建议定义sum的时候使用long long 类型,否则程序有可能过不去
4. (程序题)题目编号 :Exp02-Basic12,GJBook3-04-13
题目名称:数字金字塔
题目描述:编程序,制打印如下所示的n行数字金字塔(n由用户从键盘输入)。
输入:一个正整数 n (≤10)
输出:如上所示的类似数字金字塔。输出由数字 0~9构成的n行数字三角矩阵:其中第一行有1个数,第二行有3个数,依次类推,每个数字占用2位英文字符宽度,宽度不足2位的的在数字左侧补空格;整个数字三角阵,除必要的空格、数字、回车换行符,无多余字符。
样例1:
输入:1输出:(注:1的前面有一个空格)
样例2:
输入:3输出:(注:末行的第一个数字1前面有一个空格)
打表一时爽,考试泪两行
用数组打表会比较舒服,还有就是如何写出优美的for循环
一般用两层就好:
外层定义行,内层定义行的内容
#includeusing namespace std; int main() { int n = 0,m; cin >> n; int arr[10] = { 1,2,3,4,5,6,7,8,9,0 }; for (int i = 0;i < n;i++)//定义行 { //下面为行的具体内容 for (m = (2*n-1)-2*i;m > 0;m--)//打印空格 cout << " "; for (int j = 0;j < i;j++)//打印每行的前半部分 { cout << " "<= 0;k--)//后半部分 { cout << " " << arr[k]; } cout << endl; } return 0; }
请大家仔细观察内层的三个for循环,可以说是写的比较优美了
1.关键的初值for (m = (2*n-1)-2*i;m > 0;m--)//打印空格
cout << " ";
打印空格,m的初值至关重要,(2*n-1)-2*i,我们可以逆向来思考这个问题
最后一行前面只有一个空格,每向上增加一行就会增加两个空格,所以第一行有(2*n-1)个空格
2.正向遍历数组for (int j = 0;j < i;j++)//打印每行的前半部分
{
cout << " "<
3.逆向遍历数组
for (int k = i;k >= 0;k--)//后半部分
{
cout << " " << arr[k];
}



