2015-12-28 2 views
0

Im пытается написать функцию, которая подсчитывает количество цифр в числе - без операции string. Вот мой код:Подсчет чисел без строковых операций

def count_digits(n): 
    count_list=[] 
    while (n>0): 
     n=n%10 
     i=n 
     count_list.append(i) 
     n=n/10 
     return len(count_list) 

n=12345 
print count_digits(n) 

С помощью % я получить последние цифры - для того, чтобы добавить его в список. Используя /, я бросаю цифру из числа.

Сценарий не работает. Для каждого n я положил, сценарий просто печатает 1.

Спасибо!

+1

В первый раз, когда n = n% 10, n уменьшается до значения от 0 до 9, независимо от его начального значения. – yotommy

+3

Операция 'return' не имеет должным образом отступ. Он должен находиться вне цикла while. – mic4ael

+0

Кроме того, сохранение 'count_list', когда вы могли бы просто использовать счетчик приращений, кажется глупым (только трюк заключается в том, что вы обрабатываете' 0' специально или используете несколько kludgy эквивалент Python 'do' /' while', чтобы избежать необходимо обращаться с ним специально). – ShadowRanger

ответ

3

Есть несколько проблем в вашем коде:

  • return заявление должно быть вне цикла.
  • Заявление n = n % 10 изменяет n, что делает невозможным получение других цифр.
  • Я бы использовал целочисленный оператор деления //. В Python 3 n/10 даст число с плавающей запятой.
  • Как и ShadowRanger, текущее решение считает, что 0 имеет 0 цифр. Вам нужно проверить, n is 0.

Вот исправленная версия кода:

def count_digits(n): 
    if n == 0: 
     return 1 
    count_list = [] 
    while n > 0: 
     count_list.append(n % 10) 
     n = n // 10 
    return len(count_list) 

Кроме того, как было сказано в комментариях, так как ваша цель просто посчитать цифры, вам не нужно поддерживать список:

def count_digits(n): 
    if n == 0: 
     return 1 
    count = 0 
    while n > 0: 
     n = n // 10 
     count += 1 
    return count 
+1

Я бы также сказал, что использование списка совершенно не нужно, даже если это приемлемое решение –

+1

Примечание: Этот код (и оригинал) будет обрабатывать '0' как имеющие нулевые цифры, когда, как правило, он все равно должен считаться имеющим одну цифру. Его можно обработать либо с помощью 'while' condition' while True' с 'if n <= 0: break' в конце цикла (поэтому' 0' подсчитывается один раз), либо путем добавления 'if n == 0: верните 1' в начало функции.Очевидно, что все еще не обрабатывает отрицательные числа (но обработка их включает в себя определение того, что означает цифра, проще всего было бы назначить 'n = abs (n)' в верхней части функции и игнорировать знак). – ShadowRanger

2

count_list хранит цифры.

def count_digits(n): 
    count_list=[] 
    while (n>0): 
     count_list.append(n%10) 
     n-=n%10 
     n = n/10 
    return count_list 

n=12345 
print len(count_digits(n)) 

без использования списка

def count_digits(n): 
    count_list=0 
    while (n>0): 
     count_list+=1 
     n-=n%10 
     n = n/10 
    return count_list 

n=12345 
print count_digits(n) 
+0

Почему 'n - = n% 10'? Он делает 'count_list' как' list' 0s, что на самом деле не имеет значения (вы все равно получаете его «len»), но он стоит больше работы для нулевого выигрыша. – ShadowRanger

+0

@ShadowRanger Проверьте мои изменения – Zety

+0

@ShadowRanger Спасибо – Zety

2

Может быть, вы можете попробовать это, гораздо более простой подход. Нет связанных списков :)

def dcount(num): 
    count = 0 
    if num == 0: 
     return 1 
    while (num != 0): 
     num /= 10 
     count += 1 
    return count 
Смежные вопросы