【语法篇】5、for循环(二)

【语法篇】5、for循环(二)_第1张图片

一、筛选

在现实生活中,处处存在竞争和筛选,古代人们从沙砾中淘金,也是一种筛选。所谓筛选,就是在某个范围内,将符合某种特定条件的东西遴选出来的过程。筛选在编程中也有非常广泛的应用。

输出1~100内,所有能被3整除的数。

这就是一个非常典型的筛选,其实所有筛选,最重要就是解决两个问题:一是筛选的范围;二是筛选的条件。筛选在编程中具体表现为:循环+选择。

#include 
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
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<

2、水仙花数

在自然数中,如果一个三位数等于自身各位数字之立方和,则这个三位数就称为是水仙花数。如: 153=13+53+3^3,所以153是一个水仙花数。求所有的水仙花数。

稍加分析,我们不难得出,筛选的是三位数,所以范围是100~999;条件是个位的立方+十位的立方+百位的立方之和刚好等于这个三位数。我们借助数位分离可以容易得出个、十、百位的数字。

#include 
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;
}
【语法篇】5、for循环(二)_第2张图片
水仙花数

三、最大值和最小值

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取代,依次类推,直到最后抓不到人了,就是最后那个学生一直值班了。『士兵站岗』这个问题,也是同样的,遇到比站岗士兵更高的,就替换他,否则就由这个士兵一直站岗,当所有士兵的轮流比较完,最后站岗的士兵就是身高最高的士兵。为了避免出现无人站岗的情况,我们先假设第一个士兵就是最高的,先把他抓去站岗,后面再轮流比较后面的士兵。

【语法篇】5、for循环(二)_第3张图片
士兵站岗

同样的,我们不仅可以找最高的士兵,还能找最矮的士兵。这也就是最大值和最小值的求法了。假设有n个数,我们可以假定第一个数就是最大值max,也假定它同时是最小值min,剩下n-1个数依次与max/min比较,比max就更新max的值,比min小也更新min的值。最后得出的max/min就是我们所要求的。

#include 
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

2、拓展

既然我们可以挑选出最大的数,那么应该也可以挑选出第二大的数(请自行探究),可以挑出其他大的数,即是能用这种方法对数据进行排序,这样的排序思想,叫做『选择排序』,我们在学习完『数组』后,就会向大家介绍这种排序。数据的排序是整个算法的基础,我们后面会接触到大量的排序算法。

你可能感兴趣的:(【语法篇】5、for循环(二))