我试图找到一种方法来解决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)
现在这是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
但是这条规则只适用于素数,如果你尝试使用任何其他数字,那么整个想法就会崩溃。 可以对非素数进行类似的功能,还是只适用于素数?
答案 0 :(得分:1)
这确实是费马的小定理。
使用Eulers Totient函数phi进行泛化
apply plugin: 'com.android.application'
apply plugin: 'android-apt'
android {
compileSdkVersion 23
buildToolsVersion "23.0.3"
defaultConfig {
applicationId "com.example.a10648.demo"
minSdkVersion 18
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.3.0'
compile 'com.jakewharton:butterknife:8.4.0'
apt 'com.jakewharton:butterknife-compiler:8.4.0'
}
如果a和m是相对素数。
作为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
答案 1 :(得分:0)
作为替代方案,这是一种非常不同的方法。我不能写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
我假设基于零的数组。