정수의 십진수 표현의 길이를 가져 오는 스칼라 내장 메서드가 있다면 알고 싶습니다.스칼라 식으로 길이의 길이를 구할 수 있습니까?
예 : 45
은 길이가 2
입니다. 10321
의 길이는 5
입니다.
10321.toString.length
으로 길이를 얻을 수는 있지만 String 객체를 만들 때 오버 헤드로 인해 약간의 냄새가납니다. 더 좋은 방법이나 기본 제공 방법이 있습니까?
UPDATE :와
- '더 좋은'나는
- 내가
정수의 십진수 표현의 길이를 가져 오는 스칼라 내장 메서드가 있다면 알고 싶습니다.스칼라 식으로 길이의 길이를 구할 수 있습니까?
예 : 45
은 길이가 2
입니다. 10321
의 길이는 5
입니다.
10321.toString.length
으로 길이를 얻을 수는 있지만 String 객체를 만들 때 오버 헤드로 인해 약간의 냄새가납니다. 더 좋은 방법이나 기본 제공 방법이 있습니까?
UPDATE :와
는,베이스 (10)에 기록 바닥을 1을 추가 가져가 양의 정수에만 관심이 빠른 솔루션을 의미
toString
int 값이 length
이면 음의 정수로 사용할 수 없습니다. 이 코드는 양수뿐만 아니라 네거티브에서도 작동합니다.
def digits(n:Int) = if (n==0) 1 else math.log10(math.abs(n)).toInt + 1;
이것은 분명히 개인적인 취향이지만 분명히 로그 방식은 가지가 없으면 더 멋지게 보입니다. 양수 값의 경우에만 abs
을 생략 할 수 있습니다.
def digits(x: Int) = {
import math._
ceil(log(abs(x)+1)/log(10)).toInt
}
가장 쉬운 방법은 다음과 같습니다 부정적인 Int
자신의 복근의 길이를 가지고 있기 때문에
def numberLength(i : Int): Int = i.toString.length
당신은 보호대 조건을 추가 할 수 있습니다 + 당신이 같은 다음의 속도를하려면 1.
다음은 무작위 분포를 가정 할 때 매우 양호합니다.
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 배 빠릅니다. 이 같은
+1 재귀 버전. – xiefei
lengthBase10은 선형 검색 대신 이진 검색을 사용하도록 다시 작성할 수 있습니다. 바이너리 버전은 항상 같은 시간이 걸립니다. (실시간 시스템에 좋음). – user482745
뭔가 작업을 수행해야합니다
def numericLength(n: Int): Int = BigDecimal(n).precision
그것은 당신이 여기에 달성하기 위해 노력하고 어떤 모호함없이 명확하지 않다. 부호없는 정수에만 관심이 있습니까? 음수의 길이에'-'가 포함되어야합니까? – bseibold
숫자의 길이는 IMHO가 아니며 값만 있습니다. 문자열은 길이가 있으므로 문자열로 변환하면 길이가 길어질 것입니다. 너는 길이가 뭐야? – aishwarya
@aishwarya '길이'라는 표현은 '숫자의 십진수 표현에서 가장 많이 사용되는 색인 위치 (+ 1)'의 바로 가기로 사용됩니다 (http : //en.wikipedia 참조).org/wiki/Numeral_system # Positional_systems_in_detail –