【发布时间】:2016-10-27 15:13:39
【问题描述】:
我正在尝试找到一种方法来解决 FizzBuzz 问题(打印 1 到 100 之间的所有数字,如果它是 3 的倍数,则打印 Fizz,如果它是 5 的倍数,则打印 Buzz,如果两者都是,则打印 FizzBuzz)使用算术仅限。
如果你使用传统的 3 和 5 来做这件事相当容易,因为如果它是 3 的倍数,你可以使用这个方法返回 0:
(i*i)%3
这可以实现打印“FizzBuzz”的第一部分
print("FizzBuzz"[((i*i)%3)*4:4] or i)
#It's multiplied by 4 so that if it isn't a mutliple of 3 it tries to print
#"FizzBuzz"[4:4] which is blank, so it print i instead.
5的倍数也可以做类似的方法
(i^4)%5
为了使它成为一个函数式 FizzBuzz,我们需要通过以下方式将 0 转换为 8 和 1 转换为 4:
8 - ((-i^4)%5)
这现在是 python 中的一个函数式 FizzBuzz:
for i in range(1,101):
print("FizzBuzz"[((i*i)%3)*4:8 - ((-i**4)%5)] or i)
我发现有一种方法可以得到 0 或 1,具体取决于数字是否是所需数字的倍数,如下所示:
result = (number ^ (desired_number - 1)) % desired_number
但是这个规则只适用于素数,如果你用任何其他数字尝试这个,整个想法就会崩溃。 是否可以为非素数制作类似的功能,还是仅适用于素数?
【问题讨论】:
-
只需将
if i % 3 == 0替换为while i % 3 == 0?或者这很容易? -
你可以设置一个字典
d = {(True, True): "Fizzbuzz", ...},然后做print(d[x%3,x%5])。那不是更容易吗? -
哇,bias_k 的好答案
-
另外,你不是在你的问题本身中回答你自己的问题(如果没有的话可以做到)吗?还是真正的问题是“这可以以更短(且可读性更低)的方式完成吗?”
-
虽然我没有解释为什么我觉得 int(i%(non_prime)>0) 有点作弊。
标签: python math primes fizzbuzz