一週間で身につくC# の勉強中17

もう一つのprob8-14

あるクラスには、50人の生徒がいます。廊下には、1から50番までの番号がついたロッカーが並んでいます。ある日、ロッカーを使って、次のような実験をしました。

・しまっているロッカーは開ける ・開いているロッカーは閉める

という実験です。最初はすべてのロッカーは閉じてあります。 朝1番に来た生徒は、1の倍数のロッカーのみを開け閉めし、 2番目に来た生徒は、2の倍数のロッカーを開け閉めし、 3番目に来た生徒は、3の倍数のロッカーを開けしめし、 ・・・ と、以下、同様に続きます。 最後にきた生徒が、ロッカーを開け閉めした後に、扉が開いているロッカーは、何個あるでしょうか?

ヒント:整数型の長さ50の配列を用意し、開いているのを-1,閉じているものを1として、カウントしてみる。

考え方のポイント

答えは 開いているロッカーは7個 となりました。

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace prob8_14_2
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] hi = new int[50];
            for(int i = 0; i < 50;i++)
            {
                hi[i] = 1;
            }
            for(int i = 1; i < 51; i++) //生徒
            {
                for(int j = 0; j < 50; j++) //ロッカー
                {
                    if ((j + 1) % i == 0) 
                    {
                        if (hi[j] == -1)
                        {
                            hi[j] = 1;
                        }
                        else
                        {
                            hi[j] = -1;
                        }
                    }
                }
            }
            int cnt = 0;
            foreach(int i in hi)
            {
                if (i == -1)
                {
                    cnt++;
                }
            }
            Console.WriteLine("開いているロッカーは{0}個", cnt);
        }
    }
}

かなり難しい問題もありましたがチャレンジ問題はこれで完成です。