【语法篇】5、for循环(二)
一、筛选
在现实生活中,处处存在竞争和筛选,古代人们从沙砾中淘金,也是一种筛选。所谓筛选,就是在某个范围内,将符合某种特定条件的东西遴选出来的过程。筛选在编程中也有非常广泛的应用。
输出1~100内,所有能被3整除的数。
这就是一个非常典型的筛选,其实所有筛选,最重要就是解决两个问题:一是筛选的范围;二是筛选的条件。筛选在编程中具体表现为:循环+选择。
#include <iostream>
using namespace std;
int main(){
for(int i=1; i<=100; i++){ // 范围
if(i%3 == 0){ // 条件
cout << i << endl;
}
}
return 0;
}
二、筛选典型案例
1、36点
一个两位数x,将它的个位数字与十位数字对调后得到一个新数y,此时y恰好比x大36,请编程求出所有这样的两位数。
稍加分析,我们不难得出这个案例中,因为针对的对象是二位数,所以筛选的范围是10~99;条件是构造出的新数y比原来的二位数x大36,即y-x == 36。新数y的构造,即是将个位与十位数对调即可,借助数位分离,我们很容易构造出新数y。
#include<iostream>
using namespace std;
int main(){
for(int x=10;x<100;x++){
int ge=x%10;
int shi=x/10;
int y=ge*10+shi;
if(y-x==36)
cout<<x<<" ";
}
}
2、水仙花数
在自然数中,如果一个三位数等于自身各位数字之立方和,则这个三位数就称为是水仙花数。如: 153=13+53+3^3,所以153是一个水仙花数。求所有的水仙花数。
稍加分析,我们不难得出,筛选的是三位数,所以范围是100~999;条件是个位的立方+十位的立方+百位的立方之和刚好等于这个三位数。我们借助数位分离可以容易得出个、十、百位的数字。
#include <iostream>
using namespace std;
int main(){
for(int i=100; i<=999; i++){ // 范围
int g = i%10; //个位
int s = i/10%10; //十位
int b = i/100; //百位
if(g*g*g+s*s*s+b*b*b == i) //条件
cout << i << endl;
}
return 0;
}
水仙花数
三、最大值和最小值
1、求最大值和最小值
Description
输入10个数,求其中的最大数和最小数。
Input
输入10个数
Output
输出最大数和最小数
Sample Input
31
452
456
12
4
45672
1234
873
9145
1849
Sample Output
45672
4
这个问题,看起来很容易,但是要解决起来,却不是那么容易有思路。我们不妨把这个问题,看成是『士兵站岗』,总共有十个士兵,假设每个士兵身高都不同,我们要找出最高的那个士兵,让他来站岗。站岗这个问题,就像我们以前学校抓插队学生一样,老师抓到一个插队的学生A,就让A值日,直到抓到下一个插队学生B,那么A就会被B取代,依次类推,直到最后抓不到人了,就是最后那个学生一直值班了。『士兵站岗』这个问题,也是同样的,遇到比站岗士兵更高的,就替换他,否则就由这个士兵一直站岗,当所有士兵的轮流比较完,最后站岗的士兵就是身高最高的士兵。为了避免出现无人站岗的情况,我们先假设第一个士兵就是最高的,先把他抓去站岗,后面再轮流比较后面的士兵。
士兵站岗同样的,我们不仅可以找最高的士兵,还能找最矮的士兵。这也就是最大值和最小值的求法了。假设有n个数,我们可以假定第一个数就是最大值max,也假定它同时是最小值min,剩下n-1个数依次与max/min比较,比max就更新max的值,比min小也更新min的值。最后得出的max/min就是我们所要求的。
#include <iostream>
using namespace std;
int main(){
int x;
cin >> x;
int max, min;
max = min = x; //假定第一个数就是最大值和最小值
for(int i=1; i<=9; i++){ // 总共十个数,除去第一个数,还剩下九个
cin >> x;
if(x>max) //如果遇到的数比当前最大值更大,更新最大值
max = x;
if(x<min) //如果遇到的数比当前最小值更小,更新最小值
min = x;
}
cout << max << endl;
cout << min << endl;
return 0;
}
2、拓展
既然我们可以挑选出最大的数,那么应该也可以挑选出第二大的数(请自行探究),可以挑出其他大的数,即是能用这种方法对数据进行排序,这样的排序思想,叫做『选择排序』,我们在学习完『数组』后,就会向大家介绍这种排序。数据的排序是整个算法的基础,我们后面会接触到大量的排序算法。