2016-03-19 12 views
0

質問があります。例えば、最大公約数に基づく並べ替え順序

bool cmp(int a, int b) 
{ 
    return __gcd(a, b) > 1; 
} 

と:私はこのコンパレータを書く

私はこれらの数字がある場合:

2 5 6 7 8 12 15 19 20 

私のコードの出力:

20 15 12 8 6 2 5 7 19 

それは大丈夫ですが...

ただし、例:

1 2 3 4 5 6 7 8 9 

私のコードを出力

1 2 3 4 5 6 7 8 9 

私はこれをどのように行うことができますか?

このシーケンスは次のようなものでなければなりません。結果は定義されていませんので、あなたのコンパレータは、strict weak orderingを確立していない

9 6 3 (...) 
+0

おそらくあなたは 'std :: so rt'?これは動作しません。 'std :: sort'は[* strict weak ordering *](https://www.sgi.com/tech/stl/StrictWeakOrdering.html)を必要とします。これは基本的に通常の数字のようにソートしなければならないことを意味します。例えば。 '3 <4'なので、'!(4 <3) 'です。しかし、 'gcd'は* commutative *' gcd(a、b)== gcd(b、a) 'です - 同じように動作します。ソートの感覚。とにかく、あなたはどんな順序で達成しようとしているのかよく分かりません。 – BoBTFish

+0

どうすればソートできますか? – JanKo

+3

正直言って、あなたは何を達成しようとしているのか分かりません。私は、ある要素が他の要素よりも "大きく"なることが理にかなっていることは分かりません。これはプログラミングのバグではなく、数学のバグです。あなたが本当に欲しいものを考えてみてください。それは実際に理にかなっていますか? – BoBTFish

答えて

2

次が真であることを確認する必要があり、適切なコンパレータを作成するには:

cmp(a, a) == false - あなたのコンパレータはcmp(2, 2)

cmp(a, b) == true → cmp(b, a) == falseに試験に合格していません - あなたのコンパレータはcmp(2, 4)

に試験に合格していません

cmp(a, b) == true and cmp(b, c) == true → cmp(a, c) == true - コンパレータがテストに合格していないcmp(2, 6) and cmp(6, 3)

+0

あなたは私を助けることができますか? – JanKo

+0

@JanKoソート基準についてもう一度考える必要があります。ソートされたシーケンスは '9、6、3'で始まるのはなぜですか?なぜ '8、4、2'でないの?なぜ「3,6,9」、「6,3,9」などの3つの組み合わせはありませんか?並べ替えの後に数字「2、4」をどのように並べるべきですか?どうして?共通の除数を持つことは明白な順序を確立するには不十分であり、追加の基準を付けることが強制されます。 –

+0

真実は無関係なシーケンスを作成したので、gcdを構築することが重要です – JanKo

関連する問題