可分性测试算法

时间:2013-12-10 04:39:18

标签: python algorithm math

编写一个名为FooBar的函数,它接受输入整数n并在新行中打印从1到n的所有数字。如果数字可被3整除,则打印“Foo”,如果数字可被5整除,则打印“Bar”,如果数字可被3和5整除,则打印“FooBar”。否则只需打印该号码。

for example FooBar(15) should print as follows: 
1 
2 
Foo 
4 
Bar 
Foo 
7 
8 
Foo 
Bar 
11 
Foo 
13 
14 
FooBar 

很容易,但面试正在检查更好的算法。

首先我想到的是:

for i in xrange(1,101): print [i,'Fizz','Buzz','FizzBuzz'][(i%3==0)+2*(i%5==0)]

如果您有任何其他解决方法,请建议。

5 个答案:

答案 0 :(得分:5)

def foobar(n):
    for x in range(n):
        print x%3/2 * 'Foo' + x%5/4 * 'Bar' or x+1

答案 1 :(得分:1)

如果一个数字是0 mod 3和0 mod 5,则它是0 mod 15.

def foobar(n):                                                                                                                                                                                               
    for i in range(1,n+1):
        ret = ""
        if i%3==0:
            ret += 'Foo'
        if i%5==0:
            ret += 'Bar'

        if(ret):
            print ret
        else:
            print i
foobar(100)

答案 2 :(得分:1)

>>> D = {3:"Foo", 5:"Bar", 6:"Foo", 9:"Foo", 10:"Bar", 12:"Foo", 0:"FooBar"}
>>> for i in range(1, 16):
...     print D.get(i%15, i)
... 
1
2
Foo
4
Bar
Foo
7
8
Foo
Bar
11
Foo
13
14
FooBar

答案 3 :(得分:1)

>>> foobar = "FooBar   Foo  Bar Foo   Foo Bar  Foo   ".split(" ")
>>> for i in range(1, 16):
...     print foobar[i%15] or i
... 
1
2
Foo
4
Bar
Foo
7
8
Foo
Bar
11
Foo
13
14
FooBar

答案 4 :(得分:1)

只是另一种解决方案,希望有些人可能喜欢它。

values = ((3, "Foo"), (5, "Bar"))
for n in range(1, 101):
    res = ''.join(v for (k, v) in values if not n % k)
    print(res if res else n)