2011-04-29 45 views
0

我今天做了一个数学问题,首先在Python中尝试过,但在得到错误答案后,我使用了C#。基本上我是把所有的数字加起来(2^1000)。这些数字的总和就是答案。这里是我的Python脚本: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脚本得到错误的答案。我以错误的方式看待数学吗?

+2

我花了第二弄清楚为什么你的C样式转换'(INT)(N/10)'是不是语法错误在Python中。 :-) – kindall 2011-04-29 22:49:36

回答

4

只是这样做:

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

+0

啊,我认为它一定是某种截断错误,但我不知道为什么。感谢您解释它将n转换为double,这当然会让所有事情都变得透彻。 – Genzume 2011-04-29 22:54:42

2

使用整数除法。

n = n//10 

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

0

我知道这个问题真的很老,但在阅读完它之后,我似乎无法理解代码,并且觉得初学者很难理解,所以我使用list创建了一个更友好的'noob'版本:

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

(据我所知,这是BTW效率较低)