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