Advertisement

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

阅读量:

实战训练1—最大差值

问题描述:

输入n个非负整数,找出这个n整数的最大值与最小值,并求最大值和最小值的差值。

输入格式:

共两行,第一行为整数的个数 n(1≤n≤1000)。第二行为n个整数的值(整数值在int类型表示范围之内),整数之间以一个空格分隔。

输出格式:

输出一行,n个整数中的最大值,最小值和差值,并用空格隔开。

输入输出样例:

输入样例1 输出样例1
5 3 7 1 2 9 9 1 8
输入样例2 输出样例2
8 13 20 4 9 35 8 46 3 46 3 43

问题分析:

根据题意,求n个整数的最大值、最小值以差值,首先定义最大值变量和最小值变量来维护当前已经出现整数中的最大值和最小值,然后需要重复输入n次整数,到目前并且在输入每一个整数之后依次和当前的最大值与最小值比较,如果比最大值大,将最大值修改为当前输入的整数值,如果比最小值小,将最小值修改为当前输入的整数值,在n次输入比较之后,输出最大值、最小值和两者的差值,可以采用循环来实现,循环变量初始值为1,终值为n,循环变量更新为自增运算,循环体内输入整数值,并进行比较,具体程序代码如下:

复制代码
  
    
 #include<bits/stdc++.h>
    
 using namespace std;
    
 int main(){
    
     int n,minv= INT_MAX,maxv=INT_MIN;//定义整数个数变量n,n个整数的最小值minv并初始化为整数的最大值,n个整数的最大值maxv并初始化为整数最小值 
    
     cin>>n;//输入变量n 
    
     for(int i=0;i<n;i++){//重复n次整数,并比较 
    
     int tmp;//定义输入整数变量tmp 
    
     cin>>tmp;//输入整数的值 
    
     if(tmp<minv){ //tmp比最小值小,将tmp设置为minv 
    
         minv = tmp;
    
     }else if(tmp>maxv){//tmp比最大值大,将tmp设置为maxv 
    
         maxv = tmp;
    
     }
    
     }  
    
     cout<<maxv<<' '<<minv<<' '<<(maxv-minv)<<endl;//输出最大值、最小值和差值 
    
     return 0;
    
 }
    
    
    
    

实战训练2—某国人口

问题描述:

某国家有x亿人口,如果按照每年 0.1% 的速度增长,n年后该国将会有多人?人数保留小数点后四位。

输入格式:

一行,包含两个整数 x 和 n,分别是人口基数和年数,以单个空格分隔。

输出格式:

输出该国家n年后的人口数量,以亿为单位,保留到小数点后四位。

输入输出样例:

输入样例1 输出样例1
12 10 12.1205
输入样例2 输出样例2
13 5 13.0651

问题分析:

根据题意,首先需要输入当前这个国家的人口数x,以及年数n,两者均为int类型,1年后人数在人口基数上增加了0.1%,所以人数为x*1.001,2年后在此基础上再增加了0.1%,继续乘以1.001,依次下去,可以发现人口数量计算可以采用累乘的思想来解决,具体程序实现使用for循环来解决,循环变量初始值为1,终值为n,更新为自增运算,循环体中进行累乘,同时需要明确数据类型,人口数量起始值为整数,由于增长率为小数,所以在定义人口数时,采用double数据类型,具体程序代码如下:

复制代码
  
    
 #include<bits/stdc++.h>
    
 using namespace std;
    
 int main() {
    
 	int x,n;//定义初始人口数变量x和年变量n 
    
 	double sum;//定义人口总数变量sum 
    
 	cin>>x>>n;//输入x和n 
    
 	sum = x;//将sum修改为开始人口数x 
    
 	for(int i=1; i<=n; i++) {//使用循环进行累乘 
    
 		sum = sum *1.001;//使用累乘计算人口数 
    
 	}
    
 	printf("%0.4lf\n",sum);
    
 	return 0;
    
 }
    
    
    
    

实战训练3—多边形内角和

问题描述:

在欧几里德几何中,n 边形的内角和是(n−2)×180°。已知其中(n−1) 个内角的度数,就能计算出剩下的一个未知内角的度数。请编写一个程序,来解决这个问题。

输入格式:

共两行。其中第 1 行只有一个整数 n,第 2 行有 (n-1)个正整数,这n-1个整数是每个已知内角的度数。相邻两个整数之间用单个空格隔开。数据保证给定多边形合法。

输出格式:

一个正整数为未知内角的度数。

输入输出样例:

输入样例1 输出样例1
3 50 50 80
输入样例2 输出样例2
4 45 90 90 135

问题分析:

依据题意,对于n边形的n个内角之和为(n−2)×180°,已知其中的n-1个角的度数,求剩余一个角的度数,可以将n-1个角的度数进行求和,利用累加的思想,然后用总度数减去n-1个度数总和,采用for循环实现,循环变量初始值为1,终值为n-1,循环变量更新为自增运算,循环体内输入角度数并进行累加,具体程序代码如下:

复制代码
  
    
 #include<bits/stdc++.h>
    
 using namespace std;
    
 int main(){
    
     int n,sum=0,subsum=0;//定义n边形变量n、总的内角和sum并将sum初始值设置为0 n-1角的和subsum并初始化为0 
    
     cin>>n;//输入n 
    
     sum = (n-2)*180;//n边形内角总和 
    
     for(int i=1;i<n;i++){//依次输入n-1个角的度数,并进行累加 
    
     int tmp; //定义角度数 
    
     cin>>tmp;//输入角度数 
    
     subsum += tmp;//累加角度数到和变量subsum 
    
     }
    
     cout<<(sum-subsum)<<endl;//输出角的度数 
    
     return 0;
    
 }
    
    
    
    

除此之外,也可以采用累减的思想,用内角总和依次减去n-1个度数,sum剩余的值就是最后一个角的度数,同理采用循环来实现,循环变量初始值为1,终值为n-1,更新为自增运算,循环体内用内角总和依次减去输入的内角度数,具体程序代码如下:

复制代码
  
    
 #include<bits/stdc++.h>
    
 using namespace std;
    
 int main(){
    
     int n,sum=0;//定义n边形变量n、总的内角和sum并将sum初始值设置为0 
    
     cin>>n;//输入n 
    
     sum = (n-2)*180;//n边形内角总和 
    
     for(int i=1;i<n;i++){//依次输入n-1个角的度数,并进行累减 
    
     int tmp; //定义角度数 
    
     cin>>tmp;//输入角度数 
    
     sum -= tmp;//依次累减每个角度 
    
     }
    
     cout<<sum<<endl;//输出角的度数 
    
     return 0;
    
 }
    
    
    
    

全部评论 (0)

还没有任何评论哟~