2012-08-12 2 views
1

정수의 십진수 표현의 길이를 가져 오는 스칼라 내장 메서드가 있다면 알고 싶습니다.스칼라 식으로 길이의 길이를 구할 수 있습니까?

예 : 45은 길이가 2입니다. 10321의 길이는 5입니다.

10321.toString.length으로 길이를 얻을 수는 있지만 String 객체를 만들 때 오버 헤드로 인해 약간의 냄새가납니다. 더 좋은 방법이나 기본 제공 방법이 있습니까?

UPDATE :와

  • '더 좋은'나는
  • 내가
+0

그것은 당신이 여기에 달성하기 위해 노력하고 어떤 모호함없이 명확하지 않다. 부호없는 정수에만 관심이 있습니까? 음수의 길이에'-'가 포함되어야합니까? – bseibold

+1

숫자의 길이는 IMHO가 아니며 값만 있습니다. 문자열은 길이가 있으므로 문자열로 변환하면 길이가 길어질 것입니다. 너는 길이가 뭐야? – aishwarya

+0

@aishwarya '길이'라는 표현은 '숫자의 십진수 표현에서 가장 많이 사용되는 색인 위치 (+ 1)'의 바로 가기로 사용됩니다 (http : //en.wikipedia 참조).org/wiki/Numeral_system # Positional_systems_in_detail –

답변

2

는,베이스 (10)에 기록 바닥을 1을 추가 가져가 양의 정수에만 관심이 빠른 솔루션을 의미

3

toString int 값이 length이면 음의 정수로 사용할 수 없습니다. 이 코드는 양수뿐만 아니라 네거티브에서도 작동합니다.

def digits(n:Int) = if (n==0) 1 else math.log10(math.abs(n)).toInt + 1; 
4

이것은 분명히 개인적인 취향이지만 분명히 로그 방식은 가지가 없으면 더 멋지게 보입니다. 양수 값의 경우에만 abs을 생략 할 수 있습니다.

def digits(x: Int) = { 
    import math._ 
    ceil(log(abs(x)+1)/log(10)).toInt 
} 
0

가장 쉬운 방법은 다음과 같습니다 부정적인 Int 자신의 복근의 길이를 가지고 있기 때문에

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

당신은 보호대 조건을 추가 할 수 있습니다 + 당신이 같은 다음의 속도를하려면 1.

5

다음은 무작위 분포를 가정 할 때 매우 양호합니다.

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 

Calc 로그를 double precision로 만드는 것은 원하는 것이 모두 바닥면 효율적이지 않습니다.

기존 재귀 방법은 다음과 같습니다 10E8의 범위 0의 정수에 대한 로그를 복용보다 빠른

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

.

lengthBase10은 다른 모든 것보다 약 4 배 빠릅니다. 이 같은

+0

+1 재귀 버전. – xiefei

+0

lengthBase10은 선형 검색 대신 이진 검색을 사용하도록 다시 작성할 수 있습니다. 바이너리 버전은 항상 같은 시간이 걸립니다. (실시간 시스템에 좋음). – user482745

0

뭔가 작업을 수행해야합니다

def numericLength(n: Int): Int = BigDecimal(n).precision 
관련 문제