2016-05-12 2 views
3

を維持符号:はIは、そのモジュラス演算子<code>Mod(a,b,m)</code>を捜しているモジュラー距離

  • Mod(2,6,7)=-3
  • Mod(6,2,7)=3

、オペレータは、2〜4ホップ経路を回避し6の代わりに、長さ3のパスを経由して周りを回ります。aから出発してbに行くと、答えはパスの方向を保持します。

次のコードはこれを計算しますが、ほぼ確実に良い方法があります。

#include <iostream> 
#include <cmath> 

double absmin(double a, double b){ 
    if(std::abs(a)<std::abs(b)) 
    return a; 
    else 
    return b; 
} 

double ModDist(double src, double dest, double m){ 
    if(dest<src) 
    return absmin(dest+m-src, dest-src); 
    else 
    return absmin(dest-src, dest-m-src); 
} 

int main(){ 
    std::cout<<ModDist(2,6,7)<<std::endl; 
    std::cout<<ModDist(6,2,7)<<std::endl; 
} 
+2

Cタグを削除することをお勧めします。 – chux

+2

[Code Review](http://codereview.stackexchange.com/)の可能性があります。 – Steve

+1

モジュラス7で他のサンプルに期待していることを示してください。また、 'ModDist(2,5,6)'と 'ModDist(5,2,6)'から何を期待していますか? –

答えて

0

あなたの直接の距離が半分以下の距離がある場合は、文句を言わない、他の道を行くことによってよりよく行います。逆に距離の半分より大きい場合は、方向を変えることでより良くなります。

これは、あなたが標準モジュロ関数は、それがに行くためにどの方向を決めるの仕事を作るために負の数を扱うする方法を使用することができます0<=src,dest<=m

double ModDist(double src, double dest, double m){ 
    double directDistance = dest - src; 
    if(abs(directDistance)<m/2) 
    return directDistance; 
    return -(m - abs(directDistance))*sgn(directDistance); 
} 
1

前提としています

#include <cmath> 
double ModDist(double s, double d, double m) { 
    return std::fmod((d - s) * 2, m) + s - d; 
} 
1

をその名前が示唆しているように、数学ライブラリ関数remainderは、最初の引数を2番目に割った余りを返します。 fmodとは異なり、符号付きの結果を返し、実際にはremainder(a、d)は絶対値で最小のrであり、a-rはdの整数倍です。 これはb-aに適用されます。つまり、

double ModDist(double a, double b, double m) 
{ return remainder(b-a, m); 
} 
+0

ランダムなコードを貼り付けるのではなく、あなたが何をしたのか、その理由を説明してください。そうすれば、同じ問題を抱えているOPや将来の読者は、実際にそれをコピーして貼り付けるのではなく、明日も同じ質問をするだけで、あなたの答えから何かを実際に学ぶことができます。 – Oldskool

+0

fmod()を見ている間、私は代わりとしてremainder()を提示されましたが、私はそれを調べていない最も簡単な方法を見つけたと確信していました。 :-) – m69

関連する問題