Для подсчета цифр числа я пишу этот код на python:

a=int(input('number: '))
count=0
while a!=0:
    a=a//10
    count=count+1

print('number has ',count,'digits') 

Он хорошо работает для входных данных, таких как 13,1900,3222,...., но выдает ошибку для чисел, таких как: 3^21, 2^3,3*4,...

Это говорит:

ValueError: invalid literal for int() with base 10: '3**21'

3 ** 21 - целочисленный ввод. Так почему же он дает эту ошибку, и как мне это исправить?

0
amirali 31 Май 2020 в 11:08

4 ответа

Лучший ответ

Конструктор int() принимает строковое представление целых чисел, чего нет 2**5, это математическая операция, вы можете использовать eval для ее вычисления. Я добавил дополнительную переменную value, чтобы отслеживать начальное значение и печатать его в конце

value = eval(input('number: '))
a = value
count = 0
while a!=0:
    a = a//10
    count += 1    
print(value, 'has', count, 'digits') 

⚠️ ОСТОРОЖНО eval is dangerous

0
azro 31 Май 2020 в 09:49

Ты можешь попробовать

a=input('number: ') # entered 3**21
if a.isalnum():
    a = int(a)
else:
    exec("a = {}".format(a))
count=0
while a!=0:
    a=a//10
    count=count+1

print('number has ',count,'digits')

Выход

number has  11 digits

Этот код будет приводить к int только в том случае, если он содержит только цифры, в противном случае он выполнит команду python для сохранения срока действия, введенного в expiration, а не int.

0
Leo Arad 31 Май 2020 в 08:19

Ни '3^21', ни '3**21' не являются целыми числами. Это строки с выражениями Python, которые вычисляются как целые числа, если их интерпретирует интерпретатор Python.

>>> 3^21
22
>>> 3**21
10460353203

Встроенная int принимает только такие строки, как '100', '22' или '10460353203'.

(int также имеет аргумент base, который по умолчанию равен 2 и позволяет вам выдавать команды, такие как int('AA', 16), но он по-прежнему не позволяет передавать строку типа выражения, которые вы пытаетесь передать.)

0
timgeb 31 Май 2020 в 08:20

Вы должны сначала выполнить eval () для выражения, если хотите получить целое число

eval('3**21')
# 10460353203

И просто считать цифры (например, число цифр - длина строки):

num_digits = len(str(eval('3**21')))

print(num_digits)
# 11

Итак, ваш окончательный код написан быстро:

a=int(input('number: '))
num_digits = len(str(eval(str(a))))

print('number has ',num_digits,'digits') 
0
Laurent B. 31 Май 2020 в 08:25