C#入門(第8回)

前回演習問題の解答 例

問題1

問題文

Mikeは、「不思議なポケット」を手に入れた。

「不思議なポケット」は、いくつかビスケットを入れて叩くと、入れたビスケットの数が2倍になる。
Mikeは最初1枚のビスケットを持っていて、「不思議なポケット」を使ってちょうどN枚のビスケットにして、全部食べたいと思っている。
(食べきれないので枚数をオーバーしてはいけない)

この時、ちょうどN枚にするには、Mikeは最低何回ポケットを叩く必要があるか求めてください。

制約

  • 1≤N​≤108
  • 入力はすべて整数

入力

入力は以下の形式で標準入力から与えられる。

N

出力

Mikeが叩くポケットの最小回数を出力してください。


入力例 1

3

出力例 1

2

初めに1枚のビスケットをポケットに入れて叩きます。
すると、2枚のビスケットになります。
2枚のビスケットになったうちの1枚をポケットに入れて、もう一度叩くと合計で3枚になります。
よって、2回叩くと3枚になります。


入力例 2

4

出力例 2

2

初めに1枚のビスケットをポケットに入れて叩きます。
すると、2枚のビスケットになります。
2枚のビスケットをそのまま、もう一度叩くと合計で4枚になります。


入力例 3

1000

出力例 3

10

解答例

double n = double.Parse(Console.ReadLine());

if (n == 1)
{
    Console.WriteLine(0);
}
else
{
    if (n % 2 != 0)
    {
        n++;
    }
    Console.WriteLine(Math.Ceiling(Math.Log(n, 2)));
}

問題2

問題文

本田君には競技プログラミングをやっている友達がたくさんいます。
いつも素数の魅力を語られる本田君は素数に嫌気がさしてしまいました。

そこで、友達の前で整数を使う時は、「素数,1,使う数自身」以外で割り切れる整数のみにすると決意しました。
そのために、与えられた整数が友達の前で使っても良いかを判定するプログラムを作ることにしました。

制約

  • N は整数
  • 1≤N≤1014

入力

入力は以下の形式で標準入力から与えられる。

N

出力

Nが友達の前で使っても良い整数ならYES、そうでなければNOを出力してください


入力例 1

30

出力例 1

YES

10や15などで割り切れるので本田君はこの整数を使えます


入力例 2

5

出力例 2

NO

1と5以外で割り切れないので本田君は残念ながらこの整数を使えません


入力例 3

1

出力例 3

NO

入力例 4

16777216

出力例 4

YES

解答例

ulong N = ulong.Parse(Console.ReadLine());
ulong count = 0;
for (ulong i = 2; i * i < N; i++)
{
    while (N % i == 0)
    {
        count++;
        N /= i;
    }
}
if (N != 1)
{
    count++;
}
if (count > 2)
{
    Console.WriteLine("YES");
}
else
{
    Console.WriteLine("NO");
}

今回の演習問題

問題1

問題文

あなたの趣味(好きなもの)をクラスで表現してください。思い浮かばなければ、車で作成してみてください。

問題2

問題文

問題1で作成したクラスをインスタンス化してください。それぞれ別のフィールドを持つ3つのインスタンスを作成してみましょう。

コメント