A、B、C の 3 つの数のうち、最大のものと 2 番目に大きなものを探します。
最大の場合、次のような max() 関数を使用できることを知っています: max(a,max(b,c)); 2 番目に大きいものをどのように見つけますか?
A、B、C の 3 つの数のうち、最大のものと 2 番目に大きなものを探します。
最大の場合、次のような max() 関数を使用できることを知っています: max(a,max(b,c)); 2 番目に大きいものをどのように見つけますか?
アルゴリズムは次のようになります。
greatest = std::max(a, secondGreatest = std::max(b, c));
secondGreatest = std::min(std::max(std::min(b, c), a), secondGreatest);
アサートのほとんどの組み合わせの作業リストは次のとおりです。
#include <iostream>
#include <cassert>
int main()
{
int a = 5, b = 10, c = 15;
int greatest = 0, secondGreatest = 0;
greatest = std::max(a, secondGreatest = std::max(b, c));
assert(secondGreatest = std::min(std::max(std::min(b, c), a), secondGreatest) == 10);
a = 10, b = 5, c = 15;
greatest = std::max(a, secondGreatest = std::max(b, c));
assert(secondGreatest = std::min(std::max(std::min(b, c), a), secondGreatest) == 10);
a = 15, b = 5, c = 10;
greatest = std::max(a, secondGreatest = std::max(b, c));
assert(secondGreatest = std::min(std::max(std::min(b, c), a), secondGreatest) == 10);
a = 15, b = 10, c = 5;
greatest = std::max(a, secondGreatest = std::max(b, c));
assert(secondGreatest = std::min(std::max(std::min(b, c), a), secondGreatest) == 10);
a = 5, b = 15, c = 10;
greatest = std::max(a, secondGreatest = std::max(b, c));
assert(secondGreatest = std::min(std::max(std::min(b, c), a), secondGreatest) == 10);
a = 10, b = 15, c = 5;
greatest = std::max(a, secondGreatest = std::max(b, c));
assert(secondGreatest = std::min(std::max(std::min(b, c), a), secondGreatest) == 10);
a = 15, b = 5, c = 5;
greatest = std::max(a, secondGreatest = std::max(b, c));
assert(secondGreatest = std::min(std::max(std::min(b, c), a), secondGreatest) == 5);
return 0;
}
最大の 2 つの間の順序が必要ない場合は、最大のものと 2 番目に大きいものを見つける必要はありません。どの 2 つが最大かを知るには、3 つのうち最小のものを見つけるだけで済みます。そして、これは最小のものを見つけてそれを取り除く一般的なアルゴリズムを使用することによって行うことができます。
std::list<int> numbers(...) // put three your numbers here.
std::list<int>::iterator min = std::min_element(std::begin(v), std::end(v));
numbers.erase(min);
次に、 に 2 つの数字がありますnumbers
。
順序が必要な場合は、並べ替えてください。