全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之分支结构(实战项目二)
一、最值问题
利用分支结构可以依据具体条件去做决策,通过两个数的比较可以确定这两个数的大小关系,那么三个数也可以通过比较确定其大小关系。
实战训练1—输出最小数
问题描述:
输入三个整数,输出最小的数。
输入格式:
一行三个整数a,b,c,数与数之间用空格隔开。
输出格式:
一行一个整数,即最小的整数。
输入及输出样例:
输入样例1 | 输出样例1 |
3 16 1 | 1 |
输入样例2 | 输出样例2 |
46 10 23 | 10 |
问题分析:
对于该问题,在这里提供三种解题方式:
解法1:只有一个整数时,知道这个整数就是最小值;如果有两个整数a和b,那么通过关系运算符和if语句,可以判断a和b的大小;如果有三个整数a、b和c,那么最小数有三种情况:若a<b且a<c,那么a就是最小值;若b<a且b<c,那么b就是最小值;若c<a且c<b,那么c就是最小值。具体程序代码如下:
#include<bits/stdc++.h>
using namespace std;
int main() {
int a,b,c,minv;//定义变量a、b、c,以及最小值变量minv
cin>>a>>b>>c;//输入a、b和c
if(a<b && a<c){//若a<b且a<c,那么a就是最小值
minv = a;
}
if(b<a && b<c){//若b<a且b<c,那么b就是最小值
minv = b;
}
if(c<a && c<b){//若c<b且c<a,那么c就是最小值
minv = c;
}
cout<<minv<<endl;
return 0;
}
解法2:先将a和b进行比较,得到a和b两个数中的最小值,将最小值赋值给minv,然后将minv和c进行比较,如果c比minv要小,那么将c的值赋值给minv,否则minv保持不变,这样通过两次比较就得到了三个数中的最小值,主要思想是通过比较逐步将求解范围变小,这也是在C++编程中常用的方式,具体程序代码如下:
#include<bits/stdc++.h>
using namespace std;
int main() {
int a,b,c,minv;//定义变量a、b、c,以及最小值变量minv
cin>>a>>b>>c;//输入a、b和c
if(a<b ){//将a和b进行比较,如果a<b为真,
minv = a;//将a赋值给minv
}else{//否则将b赋值给minv
minv = b;
}
if(c<minv){//若c<minv,那么c就是最小值
minv = c;//将c赋值给minv
}
cout<<minv<<endl;
return 0;
}
解法3:借鉴打擂台的思想,如果只有一个整数a,a为擂主,那么最小值就是a;b来了之后,如果将擂主a打败了,那么b称为新的擂主,最小值为b,否则擂主仍为a,a还是最小值;紧接着c来挑战擂主,如果将擂主打败,c称为新的擂主,c成为最小值,否则擂主仍为之前的擂主,具体程序代码如下:
#include<bits/stdc++.h>
using namespace std;
int main() {
int a,b,c,minv;//定义变量a、b、c,以及最小值变量minv
cin>>a>>b>>c;//输入a、b和c
minv = a; //先假设最小值为a,即a为擂主
if(b<a){// b打败擂主minv,b是新的擂主
minv = b;//将b赋值给minv
}
if(c<minv){//c来打擂,c打败擂主minv,c成为新的擂主
minv = c;//将c赋值给minv
}
cout<<minv<<endl;
return 0;
}
这三种不同的解法,代表了三种不同的程序设计思想,如果涉及n个数据的求解(n很大),那么if语句便不再适用,这时需要学习新的知识——下一阶段的“循环”。
二、简单排序
比拼之下见高低。通过不停地比较,可以知道一些数据的位次,这就是排序。虽然利用if语句实现排序的局限性很大,但是其传达的程序设计思想应用很广泛。
实战训练2—三个数排序
问题描述:
试编一程序,输入三个整数,对这三个整数进行排序,由从小到大顺序输出。
输入格式:
一行三个整数a,b,c,中间用空格隔开。
输出格式:
一行三个整数由小到大排列,中间用空格隔开。
输入及输出样例:
输入样例1 | 输出样例1 |
3 16 1 | 1 3 16 |
输入样例2 | 输出样例2 |
46 10 23 | 10 23 46 |
问题分析:
可以借鉴实战训练1求解最小值的思想,先让a与b进行比较,如果a比b大,则交换a和b;在将a和c进行比较,如果a比c大,则交换a和c,这样a就存储了这三个数中的最小值;接下来比较b和c的值,如果b大于c,则交换b和c,这样b中存储了次小值,c中存储了这三个数的最大值,这样三个数就完成了排序,具体程序代码如下:
#include<bits/stdc++.h>
using namespace std;
int main() {
int a,b,c;//定义变量a、b、c
cin>>a>>b>>c;//输入a、b和c
if(a>b){//比较a和b的值,a的值比b的值大 ,交换a和b
int tmp = a;
a = b;
b = tmp;
}
if(a>c){//比较a和c的值,a的值比c的值大,则交换a和c
int tmp = a;
a = c;
c = tmp;
}
if(b>c){//比较b和c的值,b的值比c的值大,则交换b和c
int tmp = b;
b = c;
c = tmp;
}
cout<<a<<' '<<b<<' '<<c<<endl;//从小到大输出a b c 的值
return 0;
}
对于三个数排序可以使用上述思想,因为三个数排序有6种情况:
1 | a b c |
2 | a c b |
3 | b a c |
4 | b c a |
5 | c a b |
6 | c b a |
如果是abcd四个数字排序,有几种可能性?如果是abcde五个数字排序,有几种可能性?结论:这种将情况逐一列出的情况不可取,如果对于4个或者4个以上的数,需要考虑的情况变得复杂了,那么对于更多的数进行排序怎么进行处理呢,这些问题在后续的内容会逐步进行讲解。