2011-01-03 11 views
3

modular arithmeticを使用する単純な関数を作成しようとしています。これは本質的にラップアラウンドしている数行です。具体的には、私はJavaでMod 8の番号の行を使用したいと思います。Javaのモジュラ数学(周りを囲む番号の行)

私が望むのは、0と7の間の2つの数字を比較することです。これらの数字を差し引いて差のスコアを取得します。しかし、0-7 = -7ではなく、1にする必要があります.7に達すると、数値ラインは0に戻ります(したがって、0と7は1つのスペースだけです)。

この基準に適合するパッケージはありますか?

+0

あなたはこれに対する回答をあまりにも早く受け入れたと思います。あなたが受け入れる答えは-7より小さい数字を考慮しません。 –

+0

ありがとう!私はコード – Spencer

答えて

1

%モジュロ演算子を使用する必要があるようです。おそらくモジュロ演算で動作する整数関数のセットを書いてください。モジュロプラスは=(a + b)%8となります。

+1

ネガを扱うには、入力オペランドが範囲(0-7)内にあることを確認してから、Faisalの指示に従って+8を使用します。 – winwaed

-1

うーん...内蔵のこれらの日にすべての人気が基本的にすべての他の言語にも存在している剰余演算子%があります。

+1

'-7%8'が' -7'であることを確認するまで気付かなかった。 –

+1

負数の扱い方の詳細は、言語によって異なります。これは、あなたが望む動作に応じて、かなり簡単な数値レシピで処理することができます。 –

+0

実際、負数の扱い方の詳細は、演算子の種類によって異なります。たとえば、javaでは%演算子はmod演算子ではなく、除算の余りとして定義されます。すなわち、 'assert(-5%-2 == -1)' Pythonは、modが実際にすべきものにもっと数学的なアプローチを取っています。 http://ubuntuforums.org/showthread.php?t=498178 –

5

((0-7)+8) % 8?あなたのケースを修正するはずです。

注:%はModular演算子です。

+0

注:番号が-7でなく、むしろ-15? –

4

負の数がモジュロで行うことを逆にしたいと思われます。モジュラスは整数除算後の余りであることに注意してください。あなたは一般的なケースのために解決したい場合は

1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 

:あなたはそれが値の同じシリーズのために次のようになりたい

-7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 

:通常はこのようになります範囲を持っているでしょう

int m = x % 8; 
m = (m < 0) ? m + 8 : m; 

は基本的に、これは葉:あなたはこのように、弾性率の後にそれを調整する必要が(それは、-15、-20のために働くよう-27と同様-7など)任意の負の数を持つことができます正のCAあなたが望むように数字が転がるように、ネガティブなケースを調整します。

ストレート数学でこれを行うための別の方法は二度係数を取ることです。

int m = ((x % 8) + 8) % 8 

最初の弾性率はあなた-7〜7あなたの予想範囲を与えるほか、そのように負の係数を調整して正の値ですが、正の値は7より上に移動します.2番目の係数は、すべての回答が0から7の範囲にあることを保証します。これは、負の数と正の数で有効です。

0

modulo operationは必要なものです。しかし、しばしばモジュロと呼ばれるJavaの演算子%は、数学的モジュロではありません。むしろ残りの演算子です。違いは微妙で、しばしば無関係です。あなたの場合のように否定的なパラメータがある場合にのみ重要です。私はWikipedia正確な違いを説明することができると思う。

"ラップアラウンド"のためには、悲しいことにIntegerのJavaで実装されていないモジュロの数学的なバージョンが必要です。それはきれいではありませんですが、作品

BigInteger.valueOf(0-7).mod(BigInteger.valueOf(8)).longValue() 

:しかし、BigIntegerクラスには何が必要正確に行い、MOD()関数があります。

関連する問題