Python数学将每个数字加在一起

时间:2011-04-29 22:36:23

标签: c# python math

我今天做了一个数学问题并且首先在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 个答案:

答案 0 :(得分:4)

这样做:

n = 2 ** 1000
count = 0

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

print(count)

为什么您的代码出错是因为(int)(n/10)首先将n转换为double,将其除以10然后截断。在此过程中很容易出现舍入错误。在Python中,3. //用于整数除法。


哦,最后,(int)(n / 10)是一种非常糟糕的风格,我们不在Python中使用C风格的强制转换。您创建了一个int()对象,因此您使用int(n / 10)。由于舍入错误,这很容易出错,因此请使用整数除法:n // 10。由于我们正在n = n // 10,我们可以写n //= 10

答案 1 :(得分:2)

使用整数除法。

n = n//10

通过截断之后,你会失去很多次的很大一部分。

答案 2 :(得分:0)

我知道这个问题真的很老但是在阅读之后我似乎无法理解代码,觉得初学者太难理解,所以我使用列表制作了一个更“'noob-friendly'版本:

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

(据我所知,btw的效率较低)