정수에서 자릿수 길이를 찾으려면 어떻게 해야 합니까?
Python에서는 정수의 자리수를 어떻게 찾습니까?
로 하는 는, 할 수 .str(133)
길이를 됩니다.len(str(123))
문자열로 변환하지 않음
import math
digits = int(math.log10(n))+1
0과 음수를 처리하는 방법
import math
if n > 0:
digits = int(math.log10(n))+1
elif n == 0:
digits = 1
else:
digits = int(math.log10(-n))+2 # +1 if you don't count the '-'
이 기능을 함수에 넣는 것이 좋습니다.
다음은 벤치마크입니다.len(str())
있다
timeit math.log10(2**8)
1000000 loops, best of 3: 746 ns per loop
timeit len(str(2**8))
1000000 loops, best of 3: 1.1 µs per loop
timeit math.log10(2**100)
1000000 loops, best of 3: 775 ns per loop
timeit len(str(2**100))
100000 loops, best of 3: 3.2 µs per loop
timeit math.log10(2**10000)
1000000 loops, best of 3: 844 ns per loop
timeit len(str(2**10000))
100 loops, best of 3: 10.3 ms per loop
모든 math.log10 솔루션을 사용하면 문제가 발생합니다.
math.log10은 빠르지만 번호가 999999999997보다 클 경우 문제가 발생합니다.이는 플로트의 .9가 너무 많아 결과가 반올림되기 때문입니다.
, 「」를 사용해 .math.log
'''만''일 경우''len(str())
를 넘어서math.log
리리: :
def getIntegerPlaces(theNumber):
if theNumber <= 999999999999997:
return int(math.log10(theNumber)) + 1
else:
return len(str(theNumber))
이 질문이 나온 지 몇 년이 지났지만, 나는 정수의 길이를 계산하는 몇 가지 방법의 벤치마크를 작성했다.
def libc_size(i):
return libc.snprintf(buf, 100, c_char_p(b'%i'), i) # equivalent to `return snprintf(buf, 100, "%i", i);`
def str_size(i):
return len(str(i)) # Length of `i` as a string
def math_size(i):
return 1 + math.floor(math.log10(i)) # 1 + floor of log10 of i
def exp_size(i):
return int("{:.5e}".format(i).split("e")[1]) + 1 # e.g. `1e10` -> `10` + 1 -> 11
def mod_size(i):
return len("%i" % i) # Uses string modulo instead of str(i)
def fmt_size(i):
return len("{0}".format(i)) # Same as above but str.format
(libc 함수는 몇 가지 설정이 필요하지만 포함하지는 않습니다.)
size_exp
입니다.size_str
Geek Tantra 입니다.size_math
라
결과는 다음과 같습니다.
Time for libc size: 1.2204 μs
Time for string size: 309.41 ns
Time for math size: 329.54 ns
Time for exp size: 1.4902 μs
Time for mod size: 249.36 ns
Time for fmt size: 336.63 ns
In order of speed (fastest first):
+ mod_size (1.000000x)
+ str_size (1.240835x)
+ math_size (1.321577x)
+ fmt_size (1.350007x)
+ libc_size (4.894290x)
+ exp_size (5.976219x)
(면책자: 함수는 1~1,000,000 입력에 대해 실행됩니다.)
.sys.maxsize - 100000
로로 합니다.sys.maxsize
:
Time for libc size: 1.4686 μs
Time for string size: 395.76 ns
Time for math size: 485.94 ns
Time for exp size: 1.6826 μs
Time for mod size: 364.25 ns
Time for fmt size: 453.06 ns
In order of speed (fastest first):
+ mod_size (1.000000x)
+ str_size (1.086498x)
+ fmt_size (1.243817x)
+ math_size (1.334066x)
+ libc_size (4.031780x)
+ exp_size (4.619188x)
바와 같이, '우리'는 '우리'입니다.mod_size
)len("%i" % i)
은 (ㄹ 때 보다 속도로 사용할 수 있습니다.str(i)
그리고 다른 사람들보다 훨씬 더 빠릅니다.
Python 이 python 2.*
int
는 Python 빌드에 따라 4 또는 8바이트(32 또는 64비트)가 소요됩니다. sys.maxint
)2**31-1
의 경우 32비트 int의 경우,2**63-1
64비트 ints)의 경우는, 2개의 가능성 중 어느 것을 얻을 수 있는지를 나타냅니다.
3, Python 3의 경우int
예: s)long
2)의는 사용 한 메모리까지 임의의 수 .Python 2)의 s는 사용 가능한 메모리 양까지 할 수 있습니다.sys.getsizeof
는 일정한 오버헤드를 카운트하지만 임의의 값을 나타냅니다.
>>> import sys
>>> sys.getsizeof(0)
12
>>> sys.getsizeof(2**99)
28
알 수 있듯이의 문자열 '의 문자열 표현'을 .len
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★!
번호를 그대로 두다n
「」의 .n
다음과 같이 합니다.
math.floor(math.log10(n))+1
+ve 정수< 10e15 에 대한 정답이 표시됩니다. 밖에도 반환 입니다.math.log10
11만큼 수 . ★★★★★★★★★★★★★★★★★★★★★★★len(str(n))
그 이상으로, 이것은 필요하다.O(log(n))
10의 거듭제곱과 같은 시간입니다.
@SetiVolkylany 덕분에 감쇠가 이 한계까지 도달했습니다.정확해 보이는 솔루션이 구현 세부 사항에 얼마나 주의를 기울이는지 놀라울 따름입니다.
문자열로 변환하지 않고 다음과 같은 작업을 수행합니다.
def lenDigits(x):
"""
Assumes int(x)
"""
x = abs(x)
if x < 10:
return 1
return 1 + lenDigits(x / 10)
미니멀리스트 재귀 FT
친애하는 사용자 @Calvintwr에게 언급한 바와 같이 이 함수는math.log10
has 、 [ - 99999999999997 , 999999999997 ]범위를 벗어난 수치에서 문제가 발생하여 부동소수점 오류가 발생합니다.JavaScript(Google V8 및 노드)에서 이 문제가 발생했습니다.JS)와 C(GNU GCC 컴파일러)를 사용하여,'purely mathematically'
여기서는 해결이 불가능합니다.
이 요지와 답변을 바탕으로 친애하는 사용자 @Calvintwr
import math
def get_count_digits(number: int):
"""Return number of digits in a number."""
if number == 0:
return 1
number = abs(number)
if number <= 999999999999997:
return math.floor(math.log10(number)) + 1
count = 0
while number:
count += 1
number //= 10
return count
길이가 20(포함)까지인 번호로 테스트해 보았습니다.64비트 시스템의 최대 정수 길이는 19이므로 충분합니다.len(str(sys.maxsize)) == 19
).
assert get_count_digits(-99999999999999999999) == 20
assert get_count_digits(-10000000000000000000) == 20
assert get_count_digits(-9999999999999999999) == 19
assert get_count_digits(-1000000000000000000) == 19
assert get_count_digits(-999999999999999999) == 18
assert get_count_digits(-100000000000000000) == 18
assert get_count_digits(-99999999999999999) == 17
assert get_count_digits(-10000000000000000) == 17
assert get_count_digits(-9999999999999999) == 16
assert get_count_digits(-1000000000000000) == 16
assert get_count_digits(-999999999999999) == 15
assert get_count_digits(-100000000000000) == 15
assert get_count_digits(-99999999999999) == 14
assert get_count_digits(-10000000000000) == 14
assert get_count_digits(-9999999999999) == 13
assert get_count_digits(-1000000000000) == 13
assert get_count_digits(-999999999999) == 12
assert get_count_digits(-100000000000) == 12
assert get_count_digits(-99999999999) == 11
assert get_count_digits(-10000000000) == 11
assert get_count_digits(-9999999999) == 10
assert get_count_digits(-1000000000) == 10
assert get_count_digits(-999999999) == 9
assert get_count_digits(-100000000) == 9
assert get_count_digits(-99999999) == 8
assert get_count_digits(-10000000) == 8
assert get_count_digits(-9999999) == 7
assert get_count_digits(-1000000) == 7
assert get_count_digits(-999999) == 6
assert get_count_digits(-100000) == 6
assert get_count_digits(-99999) == 5
assert get_count_digits(-10000) == 5
assert get_count_digits(-9999) == 4
assert get_count_digits(-1000) == 4
assert get_count_digits(-999) == 3
assert get_count_digits(-100) == 3
assert get_count_digits(-99) == 2
assert get_count_digits(-10) == 2
assert get_count_digits(-9) == 1
assert get_count_digits(-1) == 1
assert get_count_digits(0) == 1
assert get_count_digits(1) == 1
assert get_count_digits(9) == 1
assert get_count_digits(10) == 2
assert get_count_digits(99) == 2
assert get_count_digits(100) == 3
assert get_count_digits(999) == 3
assert get_count_digits(1000) == 4
assert get_count_digits(9999) == 4
assert get_count_digits(10000) == 5
assert get_count_digits(99999) == 5
assert get_count_digits(100000) == 6
assert get_count_digits(999999) == 6
assert get_count_digits(1000000) == 7
assert get_count_digits(9999999) == 7
assert get_count_digits(10000000) == 8
assert get_count_digits(99999999) == 8
assert get_count_digits(100000000) == 9
assert get_count_digits(999999999) == 9
assert get_count_digits(1000000000) == 10
assert get_count_digits(9999999999) == 10
assert get_count_digits(10000000000) == 11
assert get_count_digits(99999999999) == 11
assert get_count_digits(100000000000) == 12
assert get_count_digits(999999999999) == 12
assert get_count_digits(1000000000000) == 13
assert get_count_digits(9999999999999) == 13
assert get_count_digits(10000000000000) == 14
assert get_count_digits(99999999999999) == 14
assert get_count_digits(100000000000000) == 15
assert get_count_digits(999999999999999) == 15
assert get_count_digits(1000000000000000) == 16
assert get_count_digits(9999999999999999) == 16
assert get_count_digits(10000000000000000) == 17
assert get_count_digits(99999999999999999) == 17
assert get_count_digits(100000000000000000) == 18
assert get_count_digits(999999999999999999) == 18
assert get_count_digits(1000000000000000000) == 19
assert get_count_digits(9999999999999999999) == 19
assert get_count_digits(10000000000000000000) == 20
assert get_count_digits(99999999999999999999) == 20
Python 3.5에서 테스트한 모든 코드 예
정수를 문자열로 변환하지 않은 자릿수를 카운트합니다.
x=123
x=abs(x)
i = 0
while x >= 10**i:
i +=1
# i is the number of digits
후세를 위해 이 문제에 대한 가장 느린 해결책은 단연코 다음과 같습니다.
def num_digits(num, number_of_calls=1):
"Returns the number of digits of an integer num."
if num == 0 or num == -1:
return 1 if number_of_calls == 1 else 0
else:
return 1 + num_digits(num/10, number_of_calls+1)
부피가 크지만 빠른 버전을 다음에 나타냅니다.
def nbdigit ( x ):
if x >= 10000000000000000 : # 17 -
return len( str( x ))
if x < 100000000 : # 1 - 8
if x < 10000 : # 1 - 4
if x < 100 : return (x >= 10)+1
else : return (x >= 1000)+3
else: # 5 - 8
if x < 1000000 : return (x >= 100000)+5
else : return (x >= 10000000)+7
else: # 9 - 16
if x < 1000000000000 : # 9 - 12
if x < 10000000000 : return (x >= 1000000000)+9
else : return (x >= 100000000000)+11
else: # 13 - 16
if x < 100000000000000 : return (x >= 10000000000000)+13
else : return (x >= 1000000000000000)+15
너무 크지 않은 숫자에 대한 비교는 5개뿐입니다.제 컴퓨터에서는, 이 속도는, PC보다 약 30%빠릅니다.math.log10
버전 및 5% 고속화len( str())
,, 아...★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
다음은 기능을 테스트/측정하는 데 사용한 일련의 숫자입니다.
n = [ int( (i+1)**( 17/7. )) for i in xrange( 1000000 )] + [0,10**16-1,10**16,10**16+1]
NB: 음수를 관리하지는 않지만 적응은 쉽습니다.
from math import log10
digits = lambda n: ((n==0) and 1) or int(log10(abs(n)))+1
정수에 저장할 수 있는 최대 수를 요구하는 경우 값은 구현에 따라 달라집니다.Python을 사용할 때는 그렇게 생각하지 않는 것이 좋습니다.어떤 경우에도 python 'integer'에 매우 큰 값을 저장할 수 있습니다.Python은 오리타입을 사용합니다!
편집: 질문자가 자릿수를 원한다는 설명을 하기 전에 답변을 드렸습니다.그러기 위해서는 수용된 답변이 제시한 방법에 동의합니다.더 이상 추가할 것이 없습니다!
def length(i):
return len(str(i))
다음을 사용하여 정수에 대해 빠르게 수행할 수 있습니다.
len(str(abs(1234567890)))
절대값 "1234567890" 문자열 길이를 가져옵니다.
abs
음수 없이 만)를합니다.str
len
는 해당 문자열의 문자열 길이를 반환합니다.
플로트에 사용할 경우 다음 중 하나를 사용할 수 있습니다.
# Ignore all after decimal place
len(str(abs(0.1234567890)).split(".")[0])
# Ignore just the decimal place
len(str(abs(0.1234567890)))-1
나중에 참조할 수 있습니다.
과학적 표기법으로 포맷하고 지수를 추출합니다.
int("{:.5e}".format(1000000).split("e")[1]) + 1
속도는 모르겠지만 간단해요.
소수점 뒤의 유효 자리수(".5e"의 "5"가 과학적 표기법의 소수 부분을 다른 자릿수로 반올림할 경우 문제가 될 수 있습니다.임의로 크게 설정했지만, 당신이 알고 있는 가장 큰 숫자의 길이를 반영할 수 있습니다.
def count_digit(number):
if number >= 10:
count = 2
else:
count = 1
while number//10 > 9:
count += 1
number = number//10
return count
def digits(n)
count = 0
if n == 0:
return 1
if n < 0:
n *= -1
while (n >= 10**count):
count += 1
n += n%10
return count
print(digits(25)) # Should print 2
print(digits(144)) # Should print 3
print(digits(1000)) # Should print 4
print(digits(0)) # Should print 1
다음은 임의의 숫자의 소수점 앞의 자릿수를 계산하는 또 다른 방법입니다.
from math import fabs
len(format(fabs(100),".0f"))
Out[102]: 3
len(format(fabs(1e10),".0f"))
Out[165]: 11
len(format(fabs(1235.4576),".0f"))
Out[166]: 4
간단한 벤치마크 테스트를 해봤습니다. 10,000개의 루프에 대해서요.
num len(str(num)) ---- len(format(fabs(num),".0f")) ---- speed-up
2**1e0 2.179400e-07 sec ---- 8.577000e-07 sec ---- 0.2541
2**1e1 2.396900e-07 sec ---- 8.668800e-07 sec ---- 0.2765
2**1e2 9.587700e-07 sec ---- 1.330370e-06 sec ---- 0.7207
2**1e3 2.321700e-06 sec ---- 1.761305e-05 sec ---- 0.1318
그것은 느리지만 더 간단한 선택이다.
그러나 이 솔루션에서도 999999999999998에서 잘못된 결과를 얻을 수 있습니다.
len(format(fabs(9999999999999998),".0f"))
Out[146]: 16
len(format(fabs(9999999999999999),".0f"))
Out[145]: 17
사용자에게 입력을 요청하고 몇 개의 숫자를 셀 필요가 있는 경우 다음과 같이 할 수 있습니다.
count_number = input('Please enter a number\t')
print(len(count_number))
주의: int를 사용자 입력으로 사용하지 마십시오.
같은 코드입니다.log10 메서드를 사용하고 있습니다.
from math import *
def digit_count(숫자):
if number>1 and round(log10(number))>=log10(number) and number%10!=0 :
return round(log10(number))
elif number>1 and round(log10(number))<log10(number) and number%10!=0:
return round(log10(number))+1
elif number%10==0 and number!=0:
return int(log10(number)+1)
elif number==1 or number==0:
return 1
log10(1)=0과 log10(0)=이기 때문에 1과 0의 경우 지정해야 했습니다.ND로 인해 언급된 조건이 충족되지 않습니다.단, 이 코드는 정수에만 적용됩니다.
상위 답변은 mathlog10이 빠르다고 하는데 len(str(n)이 더 빠르다는 결과가 나왔습니다.
arr = []
for i in range(5000000):
arr.append(random.randint(0,12345678901234567890))
%%timeit
for n in arr:
len(str(n))
//2.72 s ± 304 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%%timeit
for n in arr:
int(math.log10(n))+1
//3.13 s ± 545 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
게다가, 정확한 결과를 반환하기 위한 수학적인 방법에 논리를 추가하지 않았고, 그것이 그것을 더 느리게 할 것이라고 상상할 수 있을 뿐이다.
나는 이전의 답들이 수학이 더 빠르다는 것을 어떻게 증명했는지 모르겠다.
n = 3566002020360505
count = 0
while(n>0):
count += 1
n = n //10
print(f"The number of digits in the number are: {count}")
output : 번호의 자리수는 16 입니다.
내장된 기능을 사용하지 않고 솔루션을 찾고 있는 경우., 할 것은, 뿐입니다.a = 000
.
def number_length(a: int) -> int:
length = 0
if a == 0:
return length + 1
else:
while a > 0:
a = a // 10
length += 1
return length
if __name__ == '__main__':
print(number_length(123)
assert number_length(10) == 2
assert number_length(0) == 1
assert number_length(256) == 3
assert number_length(4444) == 4
floor(log10(n))
"정수 n과 b에 대한 로그(n,b?) 바닥을 계산하는 더 나은 방법"에 기초합니다.
import math
def floor_log(n, b):
res = math.floor(math.log(n, b))
c = b**res
return res + (b*c <= n) - (c > n)
def num_digits(n):
return 1 if n == 0 else 1 + floor_log(abs(n), 10)
때문에 할 수 .n < 10**(2**52)
(이것들)
다음으로 int를 문자열로 변환할 필요가 없는 가장 간단한 방법을 나타냅니다.
15자리 숫자가 주어진다고 가정합니다. 예를 들어, n=78788999999;
n=787878899999999
n=abs(n) // we are finding absolute value because if the number is negative int to string conversion will produce wrong output
count=0 //we have taken a counter variable which will increment itself till the last digit
while(n):
n=n//10 /*Here we are removing the last digit of a number...it will remove until 0 digits will left...and we know that while(0) is False*/
count+=1 /*this counter variable simply increase its value by 1 after deleting a digit from the original number
print(count) /*when the while loop will become False because n=0, we will simply print the value of counter variable
입력:
n=787878899999999
출력:
15
str()과 같은 함수를 Import하지 않는 솔루션
def numlen(num):
result = 1
divider = 10
while num % divider != num:
divider *= 10
result += 1
return result
coin_digit = str(coin_fark).split(".")[1]
coin_digit_len = len(coin_digit)
print(coin_digit_len)
>>> a=12345
>>> a.__str__().__len__()
5
언급URL : https://stackoverflow.com/questions/2189800/how-to-find-length-of-digits-in-an-integer
'programing' 카테고리의 다른 글
JavaScript에서 중첩된 루프를 해제하는 방법 (0) | 2022.11.07 |
---|---|
Python으로 HTML 이메일 보내기 (0) | 2022.11.07 |
Java의 패턴과 일치하는 디렉토리에 파일 나열 (0) | 2022.11.07 |
페이지 새로고침 시 Nuxtjs, VUEX 및 Firebase 인증 (0) | 2022.11.07 |
PHP mysql 삽입 날짜 형식 (0) | 2022.11.07 |