No.637 X: Yet Another FizzBuzz Problem
はじめに
競技プログラミング、yukicoder
No.637 X: Yet Another FizzBuzz Problem
言語はC#
何かあればTwitter→@pirorirori_n712まで
問題
入力:a1 a2 a3 a4 a5(1≤ai≤999)
出力:対応する文字数の合計
N が 3 でも 5 でも割り切れるとき:"FizzBuzz"→8
N が 3 で割り切れ 5 で割り切れないとき:"Fizz"→4
N が 5 で割り切れ 3 で割り切れないとき:"Buzz"→4
N が 3 でも 5 でも割り切れないとき:整数 N をそのまま→Nの文字数
解き方
入力された数字を場合分けして、文字数を数えて足す。
場合分けは大きく分けて2つに分かれる
①「FizzBuzz」「Fizz」「Buzz」の文字になるパターン
②数字そのままの整数Nの文字数を数えるパターン
①「FizzBuzz」「Fizz」「Buzz」の文字になるパターン
1.N が 3 でも 5 でも割り切れるとき:"FizzBuzz"→8
Nが3でも5でも割り切れるということは、
Nは3と5の最小公倍数である15で割り切れる数である
よって、N%15==0
2.N が 3 で割り切れ 5 で割り切れないとき:"Fizz"→4
Nは3で割り切れる数、よってN%3==0
3.N が 5 で割り切れ 3 で割り切れないとき:"Buzz"→4
Nは5で割り切れる数、よってN%5==0
②数字そのままの整数Nの文字数を数えるパターン
1.Nが1桁のとき、よってN<10(1-9)、文字数は1
2.Nが2桁のとき、よって9<N<100(10-99)、文字数は2
3.Nが3桁のとき、よって99<N<10(100-999)、文字数は1
Nは1≤ai≤999なので、4桁以上はあり得ない
①ifで場合分け
②条件演算子で場合分け
③Linqを使う
①ifで場合分け
入力された文字列から数字を一つずつ取り出し、足していきます。
コード例
using System; class No637{ static void Main(string[] args){ //入力を数字ごとに分割して配列に保存 var str=Console.ReadLine().Split(' '); //合計値を入れる変数を設定 var sum=0; //入力は5つなので5回まわるループを用意 for(int i=0;i<5;++i){ //入力を保存した配列から、i番の要素を取り出してint型に変換し //それを変数に保存 int num=Int32.Parse(str[i]); //ぞれぞれの要素の文字数を場合分けで出す //文字数を一時的に保存するための変数を準備 int count=0; //3でも5でも割り切れるとき、 //すなわち3と5の最小公倍数ある15で割り切れるとき //「FizzBuzz」なので8文字 if((num%15)==0){ count=8; //3で割り切れ 5 で割り切れないとき→「Fizz」 //あるいは、5で割り切れ3で割り切れないとき→「Buzz」 //どちらも4文字 }else if(num%5==0||num%3==0){ count=4; //ここからは数字そのままの文字数になる場合 //1-9の場合、文字数は1 }else if(num<10){ count=1; //10-99の場合、文字数は2 }else if(num<100){ count=2; //100-999の場合、文字数は3 }else{ count=3; } //設定した変数にi番目の要素の文字数を足す sum+=count; } //合計を出力する Console.WriteLine(sum); } }
②条件演算子で場合分け
if文で場合分けをせずに、条件演算子で一行にまとめます
コード例
using System; class No637{ static void Main(string[] args){ //入力を数字ごとに分割して配列に保存 var str=Console.ReadLine().Split(' '); //合計値を入れる変数を設定 var sum=0; //入力は5つなので5回まわるループを用意 for(int i=0;i<5;++i){ //入力を保存した配列から、i番の要素を取り出してint型に変換し //それを変数に保存 int num=Int32.Parse(str[i]); //設定した変数にi番目の要素の文字数を足す //15で割り切れるとき8 //5あるいは3で割り切れるとき4 //10より小さいとき1 //100より小さいとき2 //上のどれにも当てはまらないとき3(100-999) sum+=((num%15)==0)?8:(num%5==0||num%3==0)?4:(num<10)?1:(num<100)?2:3; } //合計を出力する Console.WriteLine(sum); } }
③LINQを使う
コード例
using System; using System.Linq; class No637{ static void Main(string[] args){ Console.WriteLine(Console.ReadLine().Split(' ').Select(x=>Int32.Parse(x)).Sum(x=>((x%15)==0)?8:(x%5==0||x%3==0)?4:(x<10)?1:(x<100)?2:3)); } }
Nの文字数を数える部分を場合分けせずに、そのまま数えることもできる
using System; using System.Linq; class No637{ static void Main(string[] args){ //Nの文字数を数えている部分 //String型にキャストしてLengthを使う Console.WriteLine(Console.ReadLine().Split(' ').Select(x=>Int32.Parse(x)).Sum(x=>((x%15)==0)?8:(x%5==0||x%3==0)?4:x.ToString().Length)); } }