Математика Python сложить каждое число - PullRequest
0 голосов
/ 30 апреля 2011

Сегодня я выполнил математическую задачу и сначала попытался решить ее на Python, но, получив неправильный ответ, использовал C #.В основном я должен был сложить все цифры длинным числом (2 ^ 1000).Сумма этих цифр была ответом.Вот мой скрипт на python:

#! /usr/bin/env python3

n = 2**1000
count = 0

while (n > 0):
    count += n % 10
    n = (int)(n/10)

print (count)

Этот скрипт дает результат 1189. По сути, я добавляю последнюю цифру числа для подсчета, затем удаляю ее из числа и повторяю процесс.Вот аналогичный код в C #:

//Yes this string is the same output from 2^1000.  I had python write the string to file for me.
String str = "10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376";
Int32 answer = 0;
foreach (char c in str)
{
    answer += (Convert.ToInt32(c) - 48);
}

lblOutput.Text = answer.ToString();

C # дает вывод: 1366, который является правильным ответом.Мне просто любопытно, почему мой скрипт на python получает неправильный ответ.Я неправильно смотрю на математику?

Ответы [ 3 ]

4 голосов
/ 30 апреля 2011

Просто сделайте это:

n = 2 ** 1000
count = 0

while n > 0:
    count += n % 10
    n //= 10

print(count)

Почему ваш код работает неправильно, потому что (int)(n/10) сначала конвертирует n в двойное число, делит его на 10, а затем усекает. Ошибки округления легко допускаются в этом процессе. В Python 3.X // используется для целочисленного деления.


Да, и наконец, (int)(n / 10) - очень плохой стиль, мы не используем приведение в стиле C в Python. Вы создаете объект int(), поэтому используете int(n / 10). Это подвержено ошибкам благодаря ошибкам округления, поэтому вместо этого используйте целочисленное деление: n // 10. И поскольку мы делаем n = n // 10, мы можем написать n //= 10.

2 голосов
/ 30 апреля 2011

Использовать целочисленное деление.

n = n//10

Обрезая после, вы теряете очень большие доли 1 много раз.

0 голосов
/ 11 декабря 2014

Я знаю, что этот вопрос действительно старый, но после прочтения я не смог понять код и почувствовал, что новичкам было слишком трудно его понять, поэтому я сделал более «дружественную для новичков» версию, используя список:

n=2**1000
thelist=list(map(int, str(n)))
counter=0
    for x in range(0,len(thelist)):
        counter+=thelist[x]
print(counter)

(я понимаю, что это менее эффективно, кстати)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...