FizzBuzz 可以仅使用算术来完成吗?
Can FizzBuzz be done using arithmetic only?
我正在尝试找到解决 FizzBuzz 问题的方法(打印 1 到 100 之间的所有数字,如果是 3 的倍数则打印 Fizz,如果是 5 的倍数则打印 Buzz,如果两者都是 FizzBuzz)仅使用算术。
如果你使用传统的 3 和 5 来做它相当容易,因为你可以使用这种方法来 return 0 如果它是 3 的倍数:
(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
但是这个规则只适用于素数,如果你用任何其他数字尝试这个,整个想法就会分崩离析。
是否可以为非素数创建类似的函数,或者这是否仅适用于素数?
这确实是费马小定理
其中有一个使用 Eulers Totient 函数 phi 的泛化
a^phi(m) ==1 mod m
如果a和m互质。
作为phi(15)=phi(3)*phi(5)=(3-1)*(5-1)=8
,a^8 mod 15
的余数a=0,1,2,...,14
是
0,1,1,6,1,10,6,1,1,6,10,1,6,1,1.
作为替代方案,这里有一个非常不同的方法。我不会写 Python,所以这是伪代码,没有明确的 if
语句:
method FizzBuzz
array Fizz3 = ["", "", "Fizz"]; // 3 elements.
array Buzz5 = ["", "", "", "", "Buzz"]; // 5 elements.
for i = 0 to 99
print((i+1) + ": " + Fizz3[i % 3] + Buzz5[i % 5]);
end for
end method FizzBuzz
我假设基于零的数组。
我正在尝试找到解决 FizzBuzz 问题的方法(打印 1 到 100 之间的所有数字,如果是 3 的倍数则打印 Fizz,如果是 5 的倍数则打印 Buzz,如果两者都是 FizzBuzz)仅使用算术。
如果你使用传统的 3 和 5 来做它相当容易,因为你可以使用这种方法来 return 0 如果它是 3 的倍数:
(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
但是这个规则只适用于素数,如果你用任何其他数字尝试这个,整个想法就会分崩离析。 是否可以为非素数创建类似的函数,或者这是否仅适用于素数?
这确实是费马小定理
其中有一个使用 Eulers Totient 函数 phi 的泛化
a^phi(m) ==1 mod m
如果a和m互质。
作为phi(15)=phi(3)*phi(5)=(3-1)*(5-1)=8
,a^8 mod 15
的余数a=0,1,2,...,14
是
0,1,1,6,1,10,6,1,1,6,10,1,6,1,1.
作为替代方案,这里有一个非常不同的方法。我不会写 Python,所以这是伪代码,没有明确的 if
语句:
method FizzBuzz
array Fizz3 = ["", "", "Fizz"]; // 3 elements.
array Buzz5 = ["", "", "", "", "Buzz"]; // 5 elements.
for i = 0 to 99
print((i+1) + ": " + Fizz3[i % 3] + Buzz5[i % 5]);
end for
end method FizzBuzz
我假设基于零的数组。