2

整数の 10 進数表現の長さを取得するための Scala 組み込みメソッドがあるかどうかを知りたいですか?

例:45長さが2あります。10321長さがあり5ます。

で長さを取得することもできますが10321.toString.length、String オブジェクトを作成するときのオーバーヘッドのため、これには少し臭いがあります。より良い方法や組み込みの方法はありますか?

アップデート:

  • 「より良い」とは、より迅速な解決策を意味します
  • 私は正の整数にのみ興味があります
4

9 に答える 9

6

This is definitely personal preference, but I think the logarithm method looks nicer without a branch. For positive values only, the abs can be omitted of course.

def digits(x: Int) = {
    import math._
    ceil(log(abs(x)+1)/log(10)).toInt
}
于 2012-08-12T14:32:35.497 に答える
4

速度が必要な場合は、ランダムな配布を想定して、次のようなものがかなり良いです。

def lengthBase10(x: Int) =
  if      (x >= 1000000000) 10
  else if (x >= 100000000)   9
  else if (x >= 10000000)    8
  else if (x >= 1000000)     7
  else if (x >= 100000)      6
  else if (x >= 10000)       5
  else if (x >= 1000)        4
  else if (x >= 100)         3
  else if (x >= 10)          2
  else                       1

対数を倍精度で計算するのは、床だけが必要な場合は効率的ではありません。

従来の再帰的な方法は次のようになります。

def len(x: Int, i: Int = 1): Int = 
  if (x < 10) i 
  else len(x / 10, i + 1)

これは、0 から 10e8 の範囲の整数のログを取得するよりも高速です。

lengthBase10ただし、上記は他のすべてよりも約4倍高速です。

于 2012-08-12T16:08:47.523 に答える
3

toStringget lengthof int は負の整数に対しては機能しません。このコードは、正の数だけでなく負の数にも機能します。

def digits(n:Int) = if (n==0) 1 else math.log10(math.abs(n)).toInt + 1;
于 2012-08-12T14:17:41.907 に答える
2

ログをベース10に移動し、フロアを取得して1を追加します。

于 2012-08-12T14:09:13.817 に答える
1

最も簡単な方法は次のとおりです。

def numberLength(i : Int): Int = i.toString.length

Int負の値は abs + 1 の長さになるため、guarding-condition を追加することができます。

于 2012-08-12T15:30:16.460 に答える