1

大家好,我有一个菜鸟问题。

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

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.....

感谢您的帮助和指导。

4

5 回答 5

3

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

r = 0
for i in range(1,31):
    r += i / (31 - i)
print(r)
于 2013-04-02T04:01:40.963 回答
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]

删除那些最后的字符。

有关如何使用 format 函数的信息,请参阅http://docs.python.org/2/library/string.html#formatstrings 。

于 2013-04-02T04:01:52.370 回答
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"]

然后你只需使用' + '作为胶水加入这个列表

于 2013-04-02T04:02:03.093 回答
1

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

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

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

当然有一种更优雅的方法可以做到这一点,但这是一种快速而肮脏的方法。

于 2013-04-02T04:03:15.523 回答
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) ) )

于 2013-04-02T04:12:08.070 回答