一坑夯、篩選
在現(xiàn)實(shí)生活中,處處存在競爭和篩選抡四,古代人們從沙礫中淘金柜蜈,也是一種篩選。所謂篩選指巡,就是在某個(gè)范圍內(nèi)淑履,將符合某種特定條件的東西遴選出來的過程。篩選在編程中也有非常廣泛的應(yīng)用藻雪。
輸出1~100內(nèi)秘噪,所有能被3整除的數(shù)。
這就是一個(gè)非常典型的篩選阔涉,其實(shí)所有篩選缆娃,最重要就是解決兩個(gè)問題:一是篩選的范圍;二是篩選的條件瑰排。篩選在編程中具體表現(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ù)字對調(diào)后得到一個(gè)新數(shù)y字逗,此時(shí)y恰好比x大36京郑,請編程求出所有這樣的兩位數(shù)。
稍加分析葫掉,我們不難得出這個(gè)案例中些举,因?yàn)獒槍Φ膶ο笫嵌粩?shù),所以篩選的范圍是10~99俭厚;條件是構(gòu)造出的新數(shù)y比原來的二位數(shù)x大36户魏,即y-x == 36。新數(shù)y的構(gòu)造挪挤,即是將個(gè)位與十位數(shù)對調(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;
}
三纺酸、最大值和最小值
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è)問題碎紊,看起來很容易,但是要解決起來樊诺,卻不是那么容易有思路仗考。我們不妨把這個(gè)問題,看成是『士兵站崗』词爬,總共有十個(gè)士兵秃嗜,假設(shè)每個(gè)士兵身高都不同,我們要找出最高的那個(gè)士兵顿膨,讓他來站崗锅锨。站崗這個(gè)問題,就像我們以前學(xué)校抓插隊(duì)學(xué)生一樣恋沃,老師抓到一個(gè)插隊(duì)的學(xué)生A必搞,就讓A值日,直到抓到下一個(gè)插隊(duì)學(xué)生B囊咏,那么A就會(huì)被B取代恕洲,依次類推,直到最后抓不到人了匆笤,就是最后那個(gè)學(xué)生一直值班了研侣。『士兵站崗』這個(gè)問題炮捧,也是同樣的庶诡,遇到比站崗士兵更高的,就替換他咆课,否則就由這個(gè)士兵一直站崗末誓,當(dāng)所有士兵的輪流比較完扯俱,最后站崗的士兵就是身高最高的士兵。為了避免出現(xiàn)無人站崗的情況喇澡,我們先假設(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ù)(請自行探究)瓷式,可以挑出其他大的數(shù),即是能用這種方法對數(shù)據(jù)進(jìn)行排序语泽,這樣的排序思想贸典,叫做『選擇排序』,我們在學(xué)習(xí)完『數(shù)組』后踱卵,就會(huì)向大家介紹這種排序廊驼。數(shù)據(jù)的排序是整個(gè)算法的基礎(chǔ),我們后面會(huì)接觸到大量的排序算法惋砂。