Может ли FizzBuzz работать только с использованием арифметики?
Я пытаюсь найти способ решить проблему FizzBuzz (вывести все числа от 1 до 100, вывести Fizz, если оно кратно 3, вывести Buzz, если оно кратно 5, и FizzBuzz, если оба), используя только арифметику.
Это довольно легко, если вы делаете это с использованием традиционных 3 и 5, потому что вы можете использовать этот метод для возврата 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)
Теперь это функциональный FizzBuzz в Python:
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
Но это правило работает только для простых чисел, и если вы попробовали это с любым другим числом, вся идея развалится. Можно ли сделать подобную функцию для не простых чисел или это применимо только к простым числам?
2 ответа
Это действительно маленькая теорема Ферма.
Существует обобщение с использованием функции Eulers Totient фи
a^phi(m) ==1 mod 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
Я предполагаю нулевые массивы.