【语法篇】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、拓展

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容