【例3.17】
输入三个数,输出其中最大的数。
- 方法1:
设maxn用于存放三个数中的最大数,输入的三个数存放子a,b,c中,那么如果a比b和c大,则最大数是a,如果b比a和c大,那么最大数是b,否则最大数是c。
程序如下:
#include<iostream>
using namespace std;
int main() {
float a, b, c, maxn;
cin>>a>>b>>c;
if (a > b && a > c)
maxn = a;
else if (b > a && b > c)
maxn = b;
else
maxn = c;
cout<<"最大数为:"<<maxn<<endl;
return 0;
}
- 方法2:
设maxn用于存放三个数中的最大数,输入的三个数存放子a,b,c中,初始化时maxn=a,即先假设a是三个数中的最大值,接下来用b和maxn比较,如果b>maxn,
那么此时b是a,b两个数中的最大值,即maxn=b,否则maxn还是等于a,(此时maxn中存放了a,b两个数中的最大值),然后用c和maxn再比价,如果c>maxn,说明c比a,b中的最大值要大
c就应该是三个数中的最大值,即maxn=c,否则maxn还是等于a,b中的最大值。
程序如下:
#include<iostream>
using namespace std;
int main() {
float a, b, c, maxn;
cin>>a>>b>>c;
maxn = a;
if (b > maxn) maxn = b;
if (c > maxn) maxn = c;
cout<<"最大数为:"<<maxn<<endl;
return 0;
}
思考?:
假如我们要找10个数中的最大数,应该用哪种方法比较好,为什么?
【例3.18】
输入三个数,按照从大到小的顺序输出。
- 方法1:
输入的三个数存放在a、b、c中,那么存在下面几种情况。。
-
程序如下:
#include<iostream>
using namespace std;
int main() {
float a, b, c;
cin>>a>>b>>c;
if (a > b) { //确定a在b的前面,接着确认c的位置
if (b > c) //确定b在c的前面
cout<<a<<","<<b<<","<<c;
else { //确定c也在b的前面,接着确认a和c谁在前面
if (a > c)
cout<<a<<","<<c<<","<<b;
else
cout<<c<<","<<a<<","<<b;
}
} else { //确定b在a的前面,接着确认c的位置
if (b > c) { //确定b也在c的前面,接着确认a和c谁在前面
if (a > c)
cout<<b<<","<<a<<","<<c;
else
cout<<b<<","<<c<<","<<a;
} else
cout<<c<<","<<b<<","<<a;
}
return 0;
}
- 方法2:
输入的三个数存放子a,b,c中,假设我们最终让a存放三个数中最大的数,怎么实现呢?让a和b比较,如果a<b,那么将a和b的值进行交换,保证a>=b;
接着让a和c比较,如果a<c,那么让a和c的值再交换,从而保证a是三个数中的最大数;假设b中存放的是第二大的数,c中存放的是第三大的数,怎么实现呢?
如果b<c,那么让b和c的值进行交换,保证b>=c,最后输出a,b,c即可。
程序如下:
#include<iostream>
using namespace std;
int main() {
float a, b, c, temp;
cin>>a>>b>>c;
if (a < b) { //交换a和b的值
temp = a;
a = b;
b = temp;
}
if (a < c) { //交换a和c的值
temp = a;
a = c;
c = temp;
}
if (b < c) { //交换b和c的值
temp = b;
b = c;
c = temp;
}
cout<<a<<","<<b<<","<<c;
return 0;
}
说明?:
方法一和方法二哪种方法更好,为什么?,从上面的问题我们可以看出,同一个问题的解决办法可能是多种多样的,也就是我们所说的算法不一样,不同的算法解决问题的局限性,程序表达的便捷性
以及我们后续着重关注的效率都是不一样的,一个问题的解决从算法设计的角度来看没有标准答案,只有更好的答案,这也是算法设计的魅力所在。