4

i,j,k4 つの整数変数との対称性を見つけたいですl。対称性は次のとおりです。

  1. 4 つの数字はすべて等しい: XXXX、
  2. 3 つの数値が等しい: XXXY、XXYX、XYXX、YXXX
  3. 等しい数の 2 つのペア: XXYY、XYXY、XYYX、...
  4. 1 組の等しい数と 2 つの異なる数: XXYZ、XYZZ、XYZX、...
  5. すべての数値が異なります。

すべての変数は、特定の非連続範囲内で実行されます。ネストされた if else ステートメントを使用します。最初の if は、すべての変数の不等式をチェックします。そうでない場合は、ケース 1 があります。次の if は、等しいペアがあるかどうかを確認します。そうでない場合は、ケース 5 です。次の if は、3 つの等しい数をチェックします。true の場合、ケース 2 になります。それ以外の場合、最後の if は 2 つの等しい数のペアをチェックします。true の場合はケース 3、それ以外の場合はケース 4。

  if(!(i==j && j==k && k==l)){
    if(i==j || i==k || i==l || j==k || j==l || k==l){
     if((i==j && j==k) || (i==j && j==l) || (i==k && k==l) || (j==k && k==l)){            ...//do something
     }else{
    if((i==j && k==l) || (i==k && j==l) || (i==l && j==k)){ 
...//do something
    }else{
     ...//do something
    }           
  }
     }else{
     ...//do something  
     } 
 }else{
  ...//do something
 }  

これを行うより良い方法はありますか?このテストを何百万回も実行する必要があるため、パフォーマンスが向上するという意味で優れているという意味です。

4

3 に答える 3

9

samgak と同様のアイデアですが、外部テーブルは必要ありません。すべての一致の合計を数えるだけ

int count = (i==j) + (i==k) + (i==l) + (j==k) + (j==l) + (k==l);

そしてswitch、次の選択肢で行います

switch (count){
case 0: //All differenct
case 1: //One same
case 2: //Two different pairs
case 3: //Three same
case 6: //All are same
}

繰り返しますが、既に述べたように、場合によっては現在のコードの方が高速な場合があります。特に、最も一般的なケースがすべての要素が等しい場合です。

于 2017-03-13T10:33:52.257 に答える