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));
    }
}