全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之循环结构(for循环语句 ...

金歌  论坛元老 | 2024-12-29 05:40:04 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1705|帖子 1705|积分 5115

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在C++程序中,累乘的头脑应用很广泛,很多情况下累加、累乘和累除相互结合利用可以办理很多问题。
实战训练1—求阶乘
问题描述:
给定正整数 n,求从 1到 n 的每一个整数的阶乘。
输入格式:
输入一行,包罗一个正整数 (1<n≤12)。
输特别式:
输出 n行,每行有两个数,分别是 i 和 i 的阶乘,两个数之间用空格隔开。
输入输出样例:
输入样例
输出样例
5
1 1
2 2
3 6
4 24
5 120
问题分析
求1到n这n个数的和sum,利用累加的头脑,依次将这n个数累加到sum中;对于阶乘的界说n!=1*2*3*4……*n(0的阶乘为1),可以看出n的阶乘是这n个数进行相乘,仿造累加求和,累乘首先界说一个乘积变量facn,并初始化为1,利用for循环来累乘,循环变量i的初始值为1,终值为n,在循环体内将i累乘到facn中,对循环变量更新利用自增运算每次加1,具体程序代码如下:
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main(){
  4.     int n,facn=1;//定义整数变量n和阶乘变量facn并初始化为1
  5.     cin>>n;//输入n
  6.     for(int i=1;i<=n;i++){//定义循环变量i并初始化为1,终值为n,循环更新为++
  7.         facn *= i;//i累乘到阶乘变量facn中
  8.         cout<<i<<' '<<facn<<endl; //输出i以及i对应的阶乘
  9.     }
  10.     return 0;
  11. }
复制代码
思考1:为什么题目中将n的取值范围限定为:1<n<=12,如果n的值超过12,会怎么样呢?假设程序运行起来之后,输入n的值为18,程序的运行结果如下:
  1. 1 1
  2. 2 2
  3. 3 6
  4. 4 24
  5. 5 120
  6. 6 720
  7. 7 5040
  8. 8 40320
  9. 9 362880
  10. 10 3628800
  11. 11 39916800
  12. 12 479001600
  13. 13 1932053504
  14. 14 1278945280
  15. 15 2004310016
  16. 16 2004189184
  17. 17 -288522240
  18. 18 -898433024
  19. 19 109641728
复制代码
根据运行结果,可以得出n在12之前(包括12),n的阶乘都是正确的,从13开始,n的阶乘值都是错误,17和18的阶乘乃至出现了负数,原因是阶乘的结果超出了int范例的表树模围(int的范例可表示的范围为:-2147483648到2147483647),这时可将facn界说为long long范例,具体程序代码如下:
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main(){
  4.     int n;//定义整数变量n
  5.     long long facn=1;//定义阶乘变量facn并初始化为1
  6.     cin>>n;//输入n
  7.     for(int i=1;i<=n;i++){//定义循环变量i并初始化为1,终值为n,循环更新为++
  8.         facn *= i;//i累乘到阶乘变量facn中
  9.         cout<<i<<' '<<facn<<endl; //输出i以及i对应的阶乘
  10.     }
  11.     return 0;
  12. }
复制代码
将上述题目修改为求阶乘和,即1!+2!+3!+……+n!,结合累乘和累加的头脑来办理,具体程序代码如下:
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main(){
  4.     int n;//定义整数变量n
  5.     long long facn=1,sum=0;//定义阶乘变量facn并初始化为1 和 累加和变量sum并初始化为0
  6.     cin>>n;//输入n
  7.     for(int i=1;i<=n;i++){//定义循环变量i并初始化为1,终值为n,循环更新为++
  8.         facn *= i;//i累乘到阶乘变量facn中
  9.         sum += facn;//将阶乘变量累加到sum中
  10.     }
  11.     cout<<sum<<endl;//输出阶乘和
  12.     return 0;
  13. }
复制代码
实战训练2—求门生的均匀年事
问题描述:
小明班上有 n 个门生,现给出每名门生的年事且包管是一个整数,求班上全部门生的均匀年事,且保留到小数点后两位。
输入格式:
第一行有一个整数n(1≤n≤100),表示门生的人数。其后 n 行每行有 1 个整数,表示每个门生的年事,取值为15到25。
输特别式:
输出一行,该行包罗一个浮点数,为要求的均匀年事,保留到小数点后两位。
输入输出样例:
输入样例
输出样例
3
17
18
18
17.67
问题分析:
根据题意,须要将这n个门生的年事依次累加到年事和中,须要累加n次,可以利用for循环来办理,循环变量初始值为1,终值为n,循环变量更新执行自增运算,结束循环之后,将全部的年事和除以n,得到最终的均匀年事,由于不一定能除尽,因此均匀年事设置为浮点范例,同时留意在进行除法运算之前进行范例转换,具体程序代码如下:
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main(){
  4.     int n,sum=0;//定义学生个数n和年龄和sum并初始化为0  
  5.     double avg;//定义学生平均年龄
  6.     scanf("%d",&n); //输入学生个数n
  7.     for(int i=1;i<=n;i++){//定义循环变量i并初始化为1,终值为n,循环更新为++
  8.        int tmp;//定义学生年龄tmp
  9.         scanf("%d",&tmp);// 输入学生年龄
  10.         sum += tmp;//将学生年龄累加到sum中
  11.     }
  12.     avg = sum *1.0/n;//计算平均年龄,首先将sum乘以1.0转换成double类型再去除以n
  13.     printf("%0.2lf\n",avg);//格式化输出学生平均年龄 ,小数点后面保留2位
  14.     return 0;
  15. }
复制代码
思考:如果将上述题目修改为输入n个浮点数,计算这n个数的均值,并输出,小数点后面保留四位小数,则对上述代码就行修改,具体程序代码如下:
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main(){
  4.     int n;//定义浮点数的个数变量n
  5.     double sum=0.0,avg;//定义n个浮点数的和变量sum并初始化为0 以及浮点数的平均数avg
  6.     scanf("%d",&n); //输入浮点数个数n
  7.     for(int i=0;i<n;i++){
  8.         double tmp;//定义浮点数
  9.         scanf("%lf",&tmp);//输入浮点数
  10.         sum += tmp;//将浮点数的值累加到sum变量
  11.     }
  12.     avg = sum /n;//计算浮点数的平均数
  13.     printf("%0.4lf\n",avg);//格式化输出浮点数平均数,小数点后面保留2位
  14.     return 0;
  15. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

金歌

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表