FizzBu​​zz 可以仅使用算术来完成吗?

Can FizzBuzz be done using arithmetic only?

我正在尝试找到解决 FizzBu​​zz 问题的方法(打印 1 到 100 之间的所有数字,如果是 3 的倍数则打印 Fizz,如果是 5 的倍数则打印 Buzz,如果两者都是 FizzBu​​zz)仅使用算术。

如果你使用传统的 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

为了使它成为一个功能性的 FizzBu​​zz,我们需要通过以下方式将 0 转换为 8 并将 1 转换为 4:

8 - ((-i^4)%5)

现在这是 python 中的功能 FizzBu​​zz:

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)=8a^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

我假设基于零的数组。