0

コードは不要で、単純な数学理論のみが必要です。

お気に入り:

  • 「年齢を入力してください」を印刷
  • 読む(年齢)
  • 20歳以上の場合
  • 結果=「大人」
  • 「あなたは」を印刷する
  • 印刷(結果)

C言語のクラスに参加する予定ですが、その前に基礎を学びたいと思っています。multiple-if または nested-ifを使用して最大および最小の 3 つの数値を見つけるプログラム/アルゴリズムが必要です。

4

5 に答える 5

5

簡単な方法があります:

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
于 2012-09-20T18:02:15.977 に答える
0

次に、ネストされたマクロ メソッドがあります (コメントで 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));

等々。これには、整数または実数に異なる形式を必要としないというさらなる利点があります。

于 2015-12-08T22:40:15.303 に答える
0

問題の要件を考えると、問題の最適なソリューションを決定する 2 つの意味があります。

  1. 解決策を得るには、すべての番号を確認する必要があります
  2. 最善の解決策は、すべての番号を 1 回だけチェックすることです

それは次のようなものです:

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
于 2012-09-21T16:38:20.807 に答える
0

注: これは C ではありません。それはジャバスクリプトです。ただし、このような一般的な問題については、教訓は同じです。実際、構文が類似しているため、同等の C パフォーマンス テストで同じコードの多くを使用できます。

このJSPerfには、数値配列の最小値/最大値を取得する 4 つのメソッドがあります。最初は簡単な方法で行います:

  1. 最小値と最大値を arr[0] に設定
  2. インデックス i を使用して、ループを 1 から開始します。
    1. arr[i] < 分かどうかを確認します。その場合は、min を arr[i] に設定します
    2. arr[i] > max かどうかを確認します。その場合、最大値を arr[i] に設定します
  3. ループの最後で、[ min, max ] を含む配列で応答します。

2 つ目は、分割統治アプローチを使用します。これは通常、O(n^2) の問題 (たとえば、単純な実装を使用してすべての値を他のすべての値と比較する必要がある並べ替え) よりも改善されますが、このような O(n) の問題ではそうではありません。何も得られず、スタックのオーバーヘッドが追加されます。

  1. 配列の長さが 1 要素の場合は、[ arr[0], arr[0] ] を返します。
  2. 配列の長さが 2 要素の場合
    1. arr[0] > arr[1] の場合、[ arr[1], arr[0] ] を返す
    2. それ以外の場合は、arr を返します
  3. 配列を大まかに左半分と右半分に分割し、それぞれの半分で minmax を呼び出します
  4. return [最小(左[0]、右[0])、最大(左[1]、右[1]]

分割を実行するために新しい配列の作成を避けるためにインデックスを使用する再帰の別のバージョンがあります (Array#slice() は古い配列のデータから新しい配列を作成します; この種の割り当ては物事を遅らせる可能性があります)。

次に、リファレンス ポイントとして JS の Math ライブラリを使用したネイティブ ソリューションがあります。

JS エンジンの実装の違いを確認できるように、すべての主要なブラウザで実行しました。

ここにいくつかの教訓があります:

  1. 最も単純なソリューションが最適な場合もある
  2. 変更する予定のない大量のデータを処理している場合は、可能であればそのデータを指してください。少しの数学で処理できる仕事をするために新しいオブジェクトを生成しないでください。
  3. 何かが賢いからといって、それが正しいとは限りません(初心者として、あなたは本当にそれを心に留めておく必要があります)
  4. ネイティブ実装が、指定された再帰バージョンとほぼ同じくらい遅く、Chrome の場合は遅いことに注意してください。これがなぜなのかは正確にはわかりませんが、配列からネイティブ引数リストへの暗黙のキャストが2 回(Function#apply() を介して) 行われることを期待しています。これを行うことによるパフォーマンスへの影響は意図しない結果であり、ライブラリを使用するときは常に注意する必要があります。ライブラリ コードでパフォーマンスの問題点に遭遇した場合、それはライブラリ コードが必要以上のことをしようとしているだけかもしれません。データをライブラリの優先フォーマットに変換してもパフォーマンスが低下する可能性があります。問題が何であれ、すべての追加機能なしで同等の機能を一緒にハッキングすることが正しい答えである場合があります。
  5. プラットフォームが重要です。あるシステムでは高速であっても、別のシステムでは高速ではない場合があります。そこにあるものすべてをテストする必要はありませんが、ユーザーが何を使用しているかを把握し、それらのそれぞれに対してテストする必要があります。
于 2015-06-01T02:06:05.123 に答える