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

时间:2016-10-27 15:13:40

标签: python math primes fizzbuzz

我试图找到一种方法来解决FizzBu​​zz问题(打印1到100之间的所有数字,打印Fizz,如果它是3的倍数,打印Buzz,如果它是5的倍数)和FizzBu​​zz如果它们都只使用算术。

如果你使用传统的3和5这样做很容易,因为你可以使用这个方法返回0,如果它是3的倍数:

(i*i)%3

这可以实现打印" FizzBu​​zz"

的第一部分
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

但是这条规则只适用于素数,如果你尝试使用任何其他数字,那么整个想法就会崩溃。 可以对非素数进行类似的功能,还是只适用于素数?

2 个答案:

答案 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

我假设基于零的数组。