大家好,我有一个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.....
感谢您的帮助和指导。
答案 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/30 + 2/29 + 3/28 +
... +30/1
:
print( " + ".join( "%d/%d" % (n, 31-n) for n in range(1,31) ) )
将其作为算术表达式进行评估并打印结果:
print( sum( n/(31.0-n) for n in range(1,31) ) )
...但是作为分数而不是小数:
from fractions import Fraction
...
print( sum( Fraction(n,31-n) for n in range(1,31) ) )