Python循环:1/30 + 2/29 + 3/28

时间:2013-04-02 03:56:46

标签: python for-loop while-loop fractions

大家好,我有一个noob问题。

如何设置以下代码进行打印:

1/30 + 2/29 + 3/28..........30/1

分子增加\分母减少

我有以下内容:

for i in range(1,31):
    v = i
for j in range(30,0,-1):
    t = j
    print(v/t)

但打印

1.0
1.0344827586206897
1.0714285714285714
1.1111111111111112
1.15384615384.........

我如何获得1/30 + 2/29 + 3/28.....

感谢您的帮助和指导。

5 个答案:

答案 0 :(得分:3)

你只需要一个循环!分母总是31减去分子。

r = 0
for i in range(1,31):
    r += i / (31 - i)
print(r)

答案 1 :(得分:1)

这里发生的事情是您的号码在打印前被评估为浮点数。由于您希望在不进行评估的情况下打印它们,因此应将它们插入到字符串中。以下行演示了如何在不对其进行评估的情况下将变量插入到输出中:

print "%d/%d" % (v,t)

有关如何为打印功能设置字符串格式的信息,请参阅http://docs.python.org/release/2.5.2/lib/typesseq-strings.html

但是,这仍然将每个结果放在一个单独的行上,因为print函数会自动插入一个新行。您可以使用以下循环构建一个字符串(注意如何将它整齐地打包到一个循环而不是两个循环中,因为您可以通过减去得到分母):

string = ''
for i in range(1,31):
    string += "{}/{} + ".format(i, 31-i)
print string

这会给你“1/30 + 2/29 + ... + 30/1 +”,但这仍然包括最后一个加号和周围的空格。要解决此问题,请将最后一行更改为

print string[:-3]

删除最后一个字符。

有关如何使用格式化功能的信息,请参阅http://docs.python.org/2/library/string.html#formatstrings

答案 2 :(得分:1)

print (" + ".join(["%s/%s"%(num,denom)for num,denom in zip(range(1,31),range(30,0,-1))]))

我认为至少

(1,2,3...,30)(30,29,28...,1)压缩在一起会产生一个新的元组((1,30),(2,29),...,(30,1))

然后你迭代这个把每个分子和分母放到一个字符串中产生一个列表,我们用格式字符串"%s/%s"%numerator,denominator做这个,尽管使用"%d/%d"代替它会更好另一个故事

["1/30","2/29",...,"30/1"]

然后您只需使用' + '作为粘合剂

加入此列表

答案 3 :(得分:1)

我认为你想要字符串而不是数字值,对吗?

s = ''
for j in range(30, 0, -1):
    s += "{}/{} + ".format(31-j, j)
print s[:-2]

阅读this documentation以掌握它。本质上,它使用两对花括号作为占位符来格式化字符串,并在第一个插槽中传入值31-j,在第二个插槽中传入j。

当然有更优雅的方法,但这是快速而肮脏的方法。

答案 4 :(得分:1)

我不确定你到底要做什么,但你可以只用一个循环来做。每次循环时,分母只有31减去分子:

from fraction import Fraction
for num in range(1,31):
    den = 31 - num
    fraction_string = "%d/%d" % (num, den)
    fraction_value = Fraction(num, den)
    quotient = num / den
    #... do stuff with whichever of the above you want

当你构建一个结果时 - 要么添加一个总和,要么附加到一个字符串,要么在每次迭代时输出一些东西 - 你可以用列表推导和列表函数更简洁地做到这一点。例如,而不是像这样的东西:

quotientList = []
for n in range(1,31):        
    quotientList.append( n / (31 - n) )

你可以这样做:

quotientList = [ n / (31 - n) for n in range(1,31) ]

而不是这个:

total = 0
for n in someList:
   total = total + n

你可以这样做:

 total = sum(someList)

将这些概念放在一起,以下是我看到的三种可能性:

  1. 打印文字字符串1/30 + 2/29 + 3/28 + ... +30/1

    print( " + ".join( "%d/%d" % (n, 31-n) for n in range(1,31) ) )

  2. 将其作为算术表达式进行评估并打印结果:

    print( sum( n/(31.0-n) for n in range(1,31) ) )

  3. ...但是作为分数而不是小数:

    from fractions import Fraction
    ...
    print( sum( Fraction(n,31-n) for n in range(1,31) ) )