подсчет количества цифр в большем числе - PullRequest
2 голосов
/ 29 января 2012

Я сейчас пробую Project Euler, и один из вопросов - вычислить 2 ^ 1000 и посчитать количество цифр.Я легко могу сделать это для 2 ^ 15, но проблема с 2 ^ 1000 состоит в том, что когда я вычисляю это, оно дается в научной записи, поэтому трудно суммировать цифры.

import math

def power(x):
    y_p=1000*math.log(x,10.0)
    y=math.pow(10,y_p)
    return y

if __name__=="__main__":

    ans=power(2)
    a=str(ans)
    print a
    sum=0

    for i in a:
       if i == ".":
          print "encountered ."
       elif i == "e":
          break
       else:
          sum=sum+int(i)

    print sum

Ответы [ 8 ]

5 голосов
/ 29 января 2012

Для вычисления 2 ^ 1000 в Python используйте 2**1000.Используя функции с плавающей точкой, такие как math.log и math.pow, вы, вероятно, получите неточные результаты.

Теперь вот как это сделать:

l = str(2**1000)
digits = [int(digit) for digit in l]
print sum(digits)

Первая строка преобразует числов строку в базовом 10 представлении. Вторая строка перебирает символы и преобразует строку в список цифр.А третий печатает их сумму.

2 голосов
/ 04 марта 2012

На самом деле более простой способ - использовать log (или log10) в python. log10 обладает достаточной точностью для этого и даже может мгновенно решить 2 ** 1000000, не занимая места.

from math import log10
ans=int(1000*log10(2))+1
1 голос
/ 29 января 2012

Другие ответы касаются того, как сложить цифры в большое число, но если ваш вопрос действительно о том, как получить число цифр, тогда просто наберите

largenumber=2*1000
int(math.log(largenumber,10)+1)

len(str(largenumber))
0 голосов
/ 13 декабря 2016

Еще одна опция для подсчета количества цифр большого целого числа -

int(math.ceil(math.log10(big_integer)))

Например:

>>> big_integer=2**100
>>> print int(math.ceil(math.log10(big_integer)))
31
>>> print big_integer
1267650600228229401496703205376
0 голосов
/ 29 января 2012

Чтобы решить эту проблему, используйте целочисленную математику и преобразуйте результат в строку:

>>> digits = str(2 ** 1000)
>>> len(digits)              # count the digits
302
>>> sum(map(int, digits))    # sum the digits
1366
0 голосов
/ 29 января 2012

Избегайте использования двойной точности и используйте вместо этого целые числа произвольной длины:

  sum([ int(i) for i in str(2 ** 1000) ])
0 голосов
/ 29 января 2012

Используйте целочисленную арифметику, int s в Python не переполняется, поэтому нет необходимости выполнять вычисления с плавающей запятой. Рассчитайте мощность самостоятельно:

def pow(a, b):
    n = 1
    for i in range(b):
        n *= a
    return a

который является O (n). Вы также можете попробовать метод O (LG N):

def pow(a, b):
    if b == 0:
        return 1
    temp = pow(a, b/2)
    if b % 2 == 0:
        return temp * temp
    return temp * temp * a

Рассчитайте сумму цифр, как вы делаете сейчас.

0 голосов
/ 29 января 2012

Как насчет использования long ()?

import math

def power(x):
    y_p = 1000 * math.log(x, 10.0)
    y = math.pow(10, y_p)
    return long(y)  # convert to long since we know it is an integral value

if __name__ == "__main__":
    ans = power(2)
    a = str(ans)
    print a
    print len(a)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...