47

私はErlangが初めてです。モジュロ (除算の余りを取得) はどのように行うのですか? ほとんどの C ライクな言語では % ですが、Erlang ではコメントを指定します。

何人かは rem で答えましたが、ほとんどの場合は問題ありません。しかし、私は負の数を使用する必要があり、 rem は負の数のモジュロと同じではない除算の残りを与えるため、これを再検討しています。

4

8 に答える 8

45

Erlang では、5 rem 3.Gives2-5 rem 3.Gives -2. -5 rem 3.私があなたの質問を理解しているなら、あなたは代わりに 1 を与えたいと思うでしょう。-5 = -2 * 3 + 1.

これはあなたが望むことをしますか?

mod(X,Y) when X > 0 -> X rem Y;
mod(X,Y) when X < 0 -> Y + X rem Y;
mod(0,Y) -> 0.
于 2009-05-13T15:30:02.593 に答える
28

アーランモジュロ演算子はrem

Eshell V5.6.4  (abort with ^G)
1> 97 rem 10.
7
于 2008-12-09T15:57:08.337 に答える
10

私はエリキシルで以下を使用しました:

defp mod(x,y) when x > 0, do: rem(x, y);
defp mod(x,y) when x < 0, do: rem(x, y) + y;
defp mod(0,_y), do: 0
于 2016-12-06T22:31:54.293 に答える
3

このブログ投稿によると、 rem.

于 2008-12-09T15:56:52.223 に答える
2

上記の Y + X rem Y は間違っているようです: (Y + X) rem Y または Y + (X rem Y) のどちらかが間違った結果をもたらします。例: Y=3 とします。X=-4 の場合、最初のフォームは -1 を返します。X=-3 の場合、2 番目のフォームは 3 を返します。[0;3[.

代わりにこれを使用します:

% Returns the positive remainder of the division of X by Y, in [0;Y[. 
% In Erlang, -5 rem 3 is -2, whereas this function will return 1,  
% since -5 =-2 * 3 + 1.

modulo(X,Y) when X > 0 ->   
   X rem Y;

modulo(X,Y) when X < 0 ->   
    K = (-X div Y)+1,
    PositiveX = X + K*Y,
    PositiveX rem Y;

modulo(0,_Y) -> 
    0.
于 2010-03-05T11:40:22.247 に答える
1
mod(A, B) when A > 0 -> A rem B;
mod(A, B) when A < 0 -> mod(A+B, B); 
mod(0, _) -> 0.

% console:
3> my:mod(-13, 5).
2
于 2012-05-20T20:19:37.880 に答える
1

Erlang の剰余は負の数では機能しないため、負のパラメーターに対して独自の関数を作成する必要があります。

于 2009-05-13T15:07:44.360 に答える
1

受け入れられた答えは間違っています。

remは、最新の Cの演算子とまったく同じように動作し%ます。切り捨て除算を使用します。

X<0 および Y<0 の場合、受け入れられた回答は失敗します。考慮してくださいmod(-5,-3)

C:                     -5 % -3 == -2
rem:                 -5 rem -3 == -2
Y + X rem Y:    -3 + -5 rem -3 == -5 !! wrong !!

モジュロ演算子の代替実装では、床除算とユークリッド除算を使用します。それらの結果は

flooring division:   -5 mod -3 == -2
euclidean division:  -5 mod -3 == 1

そう

Y + X rem Y

X < 0 および Y < 0 のモジュロ演算子を再現しません。

期待どおりremに機能します-切り捨てられた除算を使用しています。

于 2015-06-01T16:58:40.673 に答える