FizzBu​​zz問題の解決

プログラマーとして仕事に応募するとき、私は次の内容の興味深い仕事に出会いました。



「1〜100の数字を表示するプログラムを作成します。この場合、3の倍数である数字の代わりに、プログラムは単語Fizzを表示し、5の倍数である数字の代わりに単語Buzzを表示します。 数値が15の倍数である場合、プログラムはFizzBu​​zzという単語を表示する必要があります。 タスクは明白に思えるかもしれませんが、最もシンプルで美しいソリューションを取得する必要があります。



最も単純で美しいソリューションによって、条件演算子と比較演算の数が最も少ない、最もコンパクトなアルゴリズムを理解できます。 このようなアルゴリズムは、時間の複雑さが最も少なく、それを目指して努力します。



明らかな解決策の下では、ループ内で4つの条件演算子を使用することになっているようです。 最初は3番、2番、5番、3番、15番の多重度をチェックし、最初の3条件が満たされない場合は4番が数字を表示します。 ただし、タスクの最初の読み取り後、15の多重度をチェックするための条件を取り除くことが望まれます。これは、FizzとBuzzの単語が、3と5の倍数の条件を満たしながらFizzBu​​zzを表示できるように選択されるためです。 したがって、3つの条件を省くことができます。



#include <iostream> using namespace std; int main() { for(int i=1;i<101;i++) { if(i%3==0) cout<<"Fizz"; if(i%5==0) cout<<"Buzz"; if(i%3!=0 && i%5!=0) cout<<i; cout<<endl; } }
      
      







このコードには、すでに3つの条件ステートメントと4つの比較演算があります。



このタスクは、その定式化により、FizzBu​​zz出力の余分な条件を取り除くために、多重度条件が満たされたときに画面にテキストを表示するアルゴリズムについて考えることができるという点で優れています。 しかし、このパスは間違っており、可能な限り、条件の数を減らすために下ることは非常に困難です。

前の方法に基づいたすべてのアイデアが終了すると、文字列を使用するというアイデアが思い浮かびます。 たとえば、文字列を使用すると、単一の比較操作を取り除くことができます。



 #include <iostream> #include <string> using namespace std; int main() { for(int i=1;i<101;i++) { string str=""; if(i%3==0) str="Fizz"; if(i%5==0) str+="Buzz"; if(str=="") str=to_string(i); cout<<str+'\n'; } }
      
      







この問題に対する解決策はネットワークで最も一般的ですが、私の意見では、解決策はまだエレガントで単純ではありません。これは問題の状態に応じて努力する必要があるものです。

しかし、目的のテキストを行に割り当てず、フォーム「FizzBu​​zz Number」の行からテキストを削除しようとするとどうなりますか?



 #include <iostream> #include <string> using namespace std; int main() { for(int i=1;i<101;i++) { string n=to_string(i), f = "Fizz", b="Buzz"; if(i%3!=0) f=""; else n=""; if(i%5!=0) b=""; else n=""; cout<<n+f+b+"\n"; } }
      
      







結果のアルゴリズムには、2つの比較演算と2つの条件演算子のみが含まれます。

ネットワーク上でこの問題を解決する同様の方法は見つかりませんでした。 この資料が、雇用や同様の仕事をしている人の助けになることを願っています。



All Articles