【語(yǔ)法篇】5、for循環(huán)(二)

一、篩選

在現(xiàn)實(shí)生活中,處處存在競(jìng)爭(zhēng)和篩選,古代人們從沙礫中淘金,也是一種篩選。所謂篩選,就是在某個(gè)范圍內(nèi),將符合某種特定條件的東西遴選出來(lái)的過(guò)程。篩選在編程中也有非常廣泛的應(yīng)用。

輸出1~100內(nèi),所有能被3整除的數(shù)。

這就是一個(gè)非常典型的篩選,其實(shí)所有篩選,最重要就是解決兩個(gè)問(wèn)題:一是篩選的范圍;二是篩選的條件。篩選在編程中具體表現(xiàn)為:循環(huán)+選擇。

#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點(diǎn)

一個(gè)兩位數(shù)x,將它的個(gè)位數(shù)字與十位數(shù)字對(duì)調(diào)后得到一個(gè)新數(shù)y,此時(shí)y恰好比x大36,請(qǐng)編程求出所有這樣的兩位數(shù)。

稍加分析,我們不難得出這個(gè)案例中,因?yàn)獒槍?duì)的對(duì)象是二位數(shù),所以篩選的范圍是10~99;條件是構(gòu)造出的新數(shù)y比原來(lái)的二位數(shù)x大36,即y-x == 36。新數(shù)y的構(gòu)造,即是將個(gè)位與十位數(shù)對(duì)調(diào)即可,借助數(shù)位分離,我們很容易構(gòu)造出新數(shù)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、水仙花數(shù)

在自然數(shù)中,如果一個(gè)三位數(shù)等于自身各位數(shù)字之立方和,則這個(gè)三位數(shù)就稱為是水仙花數(shù)。如: 153=13+53+3^3,所以153是一個(gè)水仙花數(shù)。求所有的水仙花數(shù)。

稍加分析,我們不難得出,篩選的是三位數(shù),所以范圍是100~999;條件是個(gè)位的立方+十位的立方+百位的立方之和剛好等于這個(gè)三位數(shù)。我們借助數(shù)位分離可以容易得出個(gè)、十、百位的數(shù)字。

#include <iostream>
using namespace std;
int main(){
    for(int i=100; i<=999; i++){ // 范圍 
        int g = i%10;      //個(gè)位 
        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;
}
水仙花數(shù)

三、最大值和最小值

1、求最大值和最小值

Description
輸入10個(gè)數(shù),求其中的最大數(shù)和最小數(shù)。
Input
輸入10個(gè)數(shù)
Output
輸出最大數(shù)和最小數(shù)
Sample Input
31
452
456
12
4
45672
1234
873
9145
1849
Sample Output
45672
4

這個(gè)問(wèn)題,看起來(lái)很容易,但是要解決起來(lái),卻不是那么容易有思路。我們不妨把這個(gè)問(wèn)題,看成是『士兵站崗』,總共有十個(gè)士兵,假設(shè)每個(gè)士兵身高都不同,我們要找出最高的那個(gè)士兵,讓他來(lái)站崗。站崗這個(gè)問(wèn)題,就像我們以前學(xué)校抓插隊(duì)學(xué)生一樣,老師抓到一個(gè)插隊(duì)的學(xué)生A,就讓A值日,直到抓到下一個(gè)插隊(duì)學(xué)生B,那么A就會(huì)被B取代,依次類推,直到最后抓不到人了,就是最后那個(gè)學(xué)生一直值班了?!菏勘緧彙贿@個(gè)問(wèn)題,也是同樣的,遇到比站崗士兵更高的,就替換他,否則就由這個(gè)士兵一直站崗,當(dāng)所有士兵的輪流比較完,最后站崗的士兵就是身高最高的士兵。為了避免出現(xiàn)無(wú)人站崗的情況,我們先假設(shè)第一個(gè)士兵就是最高的,先把他抓去站崗,后面再輪流比較后面的士兵。

士兵站崗

同樣的,我們不僅可以找最高的士兵,還能找最矮的士兵。這也就是最大值和最小值的求法了。假設(shè)有n個(gè)數(shù),我們可以假定第一個(gè)數(shù)就是最大值max,也假定它同時(shí)是最小值min,剩下n-1個(gè)數(shù)依次與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;  //假定第一個(gè)數(shù)就是最大值和最小值
    for(int i=1; i<=9; i++){ // 總共十個(gè)數(shù),除去第一個(gè)數(shù),還剩下九個(gè) 
        cin >> x;
        if(x>max)  //如果遇到的數(shù)比當(dāng)前最大值更大,更新最大值 
            max = x;
        if(x<min)  //如果遇到的數(shù)比當(dāng)前最小值更小,更新最小值 
            min = x; 
    } 
    cout << max << endl;
    cout << min << endl; 
    return 0;
}

2、拓展

既然我們可以挑選出最大的數(shù),那么應(yīng)該也可以挑選出第二大的數(shù)(請(qǐng)自行探究),可以挑出其他大的數(shù),即是能用這種方法對(duì)數(shù)據(jù)進(jìn)行排序,這樣的排序思想,叫做『選擇排序』,我們?cè)趯W(xué)習(xí)完『數(shù)組』后,就會(huì)向大家介紹這種排序。數(shù)據(jù)的排序是整個(gè)算法的基礎(chǔ),我們后面會(huì)接觸到大量的排序算法。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容