コードは不要で、単純な数学理論のみが必要です。
お気に入り:
- 「年齢を入力してください」を印刷
- 読む(年齢)
- 20歳以上の場合
- 結果=「大人」
- 「あなたは」を印刷する
- 印刷(結果)
C言語のクラスに参加する予定ですが、その前に基礎を学びたいと思っています。multiple-if または nested-ifを使用して最大および最小の 3 つの数値を見つけるプログラム/アルゴリズムが必要です。
コードは不要で、単純な数学理論のみが必要です。
お気に入り:
C言語のクラスに参加する予定ですが、その前に基礎を学びたいと思っています。multiple-if または nested-ifを使用して最大および最小の 3 つの数値を見つけるプログラム/アルゴリズムが必要です。
簡単な方法があります:
int min(int a, int b, int c){
if (a <= b && a <= c){
return a;
}
if (b <= a && b <= c){
return b;
}
if (c <= a && c <= b){
return c;
}
}
比較の最小数の方法があります:
int min(int a, int b, int c){
if (a < b){
if (a < c){
return a;
}
else{
return c;
}
}
else{
if (b < c){
return b
}
else{
return c;
}
}
}
三項演算子のおかげで、コードの行数が最も少ない方法があります。
int min(int a, int b, int c){
return (a<b)?((a<c)?a:c):((b<c)?b:c);
}
コメントでtwalbergが言及した方法があります:
int min(int a, int b){
if (a <= b){return a;}
else{return b;}
}
int min(int a, int b, int c){
return min(min(a,b), c);
}
max は、これらすべての方法で定義することもでき<
ます>
。次のように定義することもできますmin
。
int max(int a, int b, int c){
return -min(-a, -b, -c);
}
関数の宣言方法をまだ学びたくない場合は、これらのいくつかをメイン関数に直接ドロップできます。たとえば、2 番目の方法:
//todo: translate this pseudocode into C
print "enter three numbers"
read(a)
read(b)
read(c)
if (a < b){
if (a < c){
min = a;
}
else{
min = c;
}
}
else{
if (b < c){
min = b
}
else{
min = c;
}
}
print "the minimum value is " + min
次に、ネストされたマクロ メソッドがあります (コメントで twalberg が述べているように)。つまり、コンパイラに単純な構造からそれを理解させます。現代のコンパイラはそれが得意です。
#define MIN(a,b) (a) < (b) ? (a) : (b)
括弧は、操作の優先順位と順序を正しくするために重要です。
最低 3 つの数値を取得するには、次のようにします。
min3 = MIN(MIN(a,b), c);
4 つの数字:
min4 = MIN(MIN(a,b), MIN(c,d));
等々。これには、整数または実数に異なる形式を必要としないというさらなる利点があります。
問題の要件を考えると、問題の最適なソリューションを決定する 2 つの意味があります。
それは次のようなものです:
1: Maximum = 0
2: Minimum = 0
3: read(number)
4: if number > Maximum then Maximum = number
5: if number < Minimum then Minimum = number
6: Repeat from 3 as many times as needed
7: Print Maximum and Minimum
注: これは C ではありません。それはジャバスクリプトです。ただし、このような一般的な問題については、教訓は同じです。実際、構文が類似しているため、同等の C パフォーマンス テストで同じコードの多くを使用できます。
このJSPerfには、数値配列の最小値/最大値を取得する 4 つのメソッドがあります。最初は簡単な方法で行います:
2 つ目は、分割統治アプローチを使用します。これは通常、O(n^2) の問題 (たとえば、単純な実装を使用してすべての値を他のすべての値と比較する必要がある並べ替え) よりも改善されますが、このような O(n) の問題ではそうではありません。何も得られず、スタックのオーバーヘッドが追加されます。
分割を実行するために新しい配列の作成を避けるためにインデックスを使用する再帰の別のバージョンがあります (Array#slice() は古い配列のデータから新しい配列を作成します; この種の割り当ては物事を遅らせる可能性があります)。
次に、リファレンス ポイントとして JS の Math ライブラリを使用したネイティブ ソリューションがあります。
JS エンジンの実装の違いを確認できるように、すべての主要なブラウザで実行しました。
ここにいくつかの教訓があります: