【C#問題集】基本的なアルゴリズムを解いてみよう!

こんにちは、村正です!

「C#でアルゴリズムを実装する問題を解きたいんだけど、なにかよさげな問題集はないかな?」と悩んでいませんか?

そんなあなたに向けて、C#用のアルゴリズム問題集を作ってみました!

ぜひC#の勉強に役立ててみてくださいね!

※解説をC#で書いているため「C#用の問題集」としていますが、問題自体はどんな言語にも対応している(かも?)なので、JavaやCを勉強するときにも使えるかもです。

問題集の使いかた

使用ツール(Visual Studio 2022)

「Visual Studio 2022」を使って作成・テストしています。

メモ帳などのテキストエディタを使って解いても問題はないと思いますが、可能であればVisual Studio 2022を使っていただけるとスムーズに解いていけるかなと思います。

解きかた

「○○の関数を実装しましょう。」のように、関数(メソッド)を実装するカタチで出題しています。

関数の呼び出し部分を自分でつくってももちろん良いのですが、、、少し面倒かなと思います。

そこで、以下のようにコメントで「//★ここ実装!★」と書かれている部分を実装(穴埋め・コーディング)できるようにしています。

/// <summary>
/// Q1)素数チェック
/// </summary>
public static bool ValidatePrimeNumber(int number)
{
    // ★ここを実装!★
}

問題文のコードをコピペして解いていくのがおすすめです。

アルゴリズムを作るところのみに注力するというわけですね!

それでは問題を解いていきましょう!

Q1)素数判定

問題

与えられた整数が素数かどうかを判定する関数(ValidatePrimeNumber())を実装してください。

出力例)

整数を入力してください:10
10 は素数ではありません。

整数を入力してください:17
17 は素数です。

using System;

namespace Brog_Algorithm_hon
{
    public class Program
    {
        static void Main(string[] args)
        {
            // ユーザーに入力を要求する
            Console.Write("整数を入力してください:");
            int number = int.Parse(Console.ReadLine());

            // 関数の呼び出し
            bool isPrime = ValidatePrimeNumber(number);

            // 表示
            if (isPrime) { Console.WriteLine("{0} は素数です。", number); }
            else { Console.WriteLine("{0} は素数ではありません。", number); }

            // ※コンソールが勝手に閉じてしまわないようにするため
            Console.ReadLine();
        }

        /// <summary>
        /// Q1)素数チェック
        /// </summary>
        public static bool ValidatePrimeNumber(int number)
        {
            // ★ここを実装!★
        }
    }
}

解答

using System;

namespace Brog_Algorithm_hon
{
    public class Program
    {
        static void Main(string[] args)
        {
            // ユーザーに入力を要求する
            Console.Write("整数を入力してください:");
            int number = int.Parse(Console.ReadLine());

            // 関数の呼び出し
            bool isPrime = ValidatePrimeNumber(number);

            // 表示
            if (isPrime) { Console.WriteLine("{0} は素数です。", number); }
            else { Console.WriteLine("{0} は素数ではありません。", number); }

            // ※コンソールが勝手に閉じてしまわないようにするため
            Console.ReadLine();
        }

        /// <summary>
        /// Q1)素数チェック
        /// </summary>
        public static bool ValidatePrimeNumber(int number)
        {
            // 1は素数ではない
            if(number == 1) { return false; }

            // 2以上の場合の判定
            for (int i = 2; i < Math.Sqrt(number); i++)
            {
                // 「2~引数の平方根 の自然数」で割り切れるのであれば素数ではない
                if (number % i == 0) { return false; }
            }

            // 素数
            return true;
        }
    }
}

Q2)総和

問題

1からnまでの整数の総和を計算する関数(SumNumber())を実装してください。

出力例)

整数を入力してください:10
1から10までの総和:55

using System;

namespace Algorithm_02
{
    public class Program
    {
        static void Main(string[] args)
        {
            // ユーザーに入力を要求する
            Console.Write("整数を入力してください:");
            int number = int.Parse(Console.ReadLine());

            // 関数の呼び出し
            int sumValue = SumNumber(number);

            // 表示
            Console.WriteLine("1から{0}までの総和:{1}", number, sumValue);

            // ※コンソールが勝手に閉じてしまわないようにするため
            Console.ReadLine();
        }

        /// <summary>
        /// Q2)総和計算
        /// </summary>
        public static int SumNumber(int number)
        {
            // ★ここを実装!★
        }
    }
}

解答

using System;

namespace Algorithm_02
{
    public class Program
    {
        static void Main(string[] args)
        {
            // ユーザーに入力を要求する
            Console.Write("整数を入力してください:");
            int number = int.Parse(Console.ReadLine());

            // 関数の呼び出し
            int sumValue = SumNumber(number);

            // 表示
            Console.WriteLine("1から{0}までの総和:{1}", number, sumValue);

            // ※コンソールが勝手に閉じてしまわないようにするため
            Console.ReadLine();
        }

        /// <summary>
        /// Q2)総和計算
        /// </summary>
        public static int SumNumber(int number)
        {
            // 総和を格納する変数
            int sum = 0;

            // 総和の計算
            for (int i = 1; i <= number; i++)
            {
                sum += i;
            }

            // 総和を返す
            return sum;
        }
    }
}

Q3)配列の最大値

問題

整数型の要素を持つ配列から、最大値を見つける関数(MaxNumber())を実装してください。

※配列の値はソースコードに埋め込みでOKです(入力を求めなくてOKです)。

出力例)

配列[3,4,1,6,5,4,1,9,2,3]の最大値は9です。

using System;

namespace Algorithm_03
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 配列の用意
            int[] numbers = { 3, 4, 1, 6, 5, 4, 1, 9, 2, 3 };

            // 関数の呼び出し
            int maxNumber = MaxNumber(numbers);

            // 表示
            Console.WriteLine("配列[{0}]の最大値は{1}です。", string.Join(",",numbers), maxNumber);

            // ※コンソールが勝手に閉じてしまわないようにするため
            Console.ReadLine();
        }

        /// <summary>
        /// Q3)配列の最大値
        /// </summary>
        public static int MaxNumber(int[] numbers)
        {
            // ★ここを実装!★
        }
    }
}

解答

using System;

namespace Algorithm_03
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 配列の用意
            int[] numbers = { 3, 4, 1, 6, 5, 4, 1, 9, 2, 3 };

            // 関数の呼び出し
            int maxNumber = MaxNumber(numbers);

            // 表示
            Console.WriteLine("配列[{0}]の最大値は{1}です。", string.Join(",",numbers), maxNumber);

            // ※コンソールが勝手に閉じてしまわないようにするため
            Console.ReadLine();
        }

        /// <summary>
        /// Q3)配列の最大値
        /// </summary>
        public static int MaxNumber(int[] numbers)
        {
            // 最大値を格納する変数(初期値にint型の最小値を格納しておく)
            int maxNumber = int.MinValue;

            // 配列の要素を1つずつ確認していく
            foreach (int number in numbers)
            {
                if (maxNumber < number)
                {
                    // 最大値の更新
                    maxNumber = number;
                }
            }

            // 最大値を返す
            return maxNumber;
        }
    }
}

Q4)出現文字のカウント

ある文字列(targetString)の中に、特定の文字(searchCharacter)がいくつ含まれるかを数える関数(Search())してください。

出力例)

ターゲット文字列:こころのこえはここにある
数える文字:こ
「こころのこえはここにある」に「こ」は5回出現します。

using System;

namespace Algorithm_04
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // ユーザーに入力を要求する
            Console.Write("ターゲット文字列:");
            string targetString = Console.ReadLine();
            Console.Write("数える文字:");
            char searchCharacter = Console.ReadLine()[0];

            // 関数の呼び出し
            int count = Search(targetString, searchCharacter);

            // 表示
            Console.WriteLine("「{0}」に「{1}」は{2}回出現します。", targetString, searchCharacter, count);

            // ※コンソールが勝手に閉じてしまわないようにするため
            Console.ReadLine();
        }

        /// <summary>
        /// Q4)出現回数のカウント
        /// </summary>
        /// <param name="targetString">対象文字列</param>
        /// <param name="searchCharacter">検索文字</param>
        /// <returns></returns>
        public static int Search(string targetString, char searchCharacter)
        {
            // ★ここを実装!★
        }
    }
}

解答例

using System;

namespace Algorithm_04
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // ユーザーに入力を要求する
            Console.Write("ターゲット文字列:");
            string targetString = Console.ReadLine();
            Console.Write("数える文字:");
            char searchCharacter = Console.ReadLine()[0];

            // 関数の呼び出し
            int count = Search(targetString, searchCharacter);

            // 表示
            Console.WriteLine("「{0}」に「{1}」は{2}回出現します。", targetString, searchCharacter, count);

            // ※コンソールが勝手に閉じてしまわないようにするため
            Console.ReadLine();
        }

        /// <summary>
        /// Q4)出現回数のカウント
        /// </summary>
        /// <param name="targetString">対象文字列</param>
        /// <param name="searchCharacter">検索文字</param>
        /// <returns></returns>
        public static int Search(string targetString, char searchCharacter)
        {
            // カウント用変数
            int count = 0;

            // 出現回数のカウント
            foreach (char c in targetString)
            {
                if (c.Equals(searchCharacter))
                {
                    count++;
                }
            }

            // 出現回数を返す
            return count;
        }
    }
}

Q5)配列のソート

整数型の要素を持つ配列を、昇順に並べ替える関数(NumbersSortAsc())を実装してください。

※配列の値はソースコードに埋め込みでOKです(入力を求めなくてOKです)。

出力例)

ソート前:[3,4,1,6,5,4,1,9,2,3]
ソート後:[1,1,2,3,3,4,4,5,6,9]

using System;

namespace Algorithm_05
{
    public class Program
    {
        static void Main(string[] args)
        {
            // 配列の用意
            int[] numbers = { 3, 4, 1, 6, 5, 4, 1, 9, 2, 3 };

            // 表示
            Console.WriteLine("ソート前:[{0}]", string.Join(",", numbers));

            // 関数の呼び出し
            NumbersSortAsc(numbers);

            // 表示
            Console.WriteLine("ソート後:[{0}]", string.Join(",", numbers));

            // ※コンソールが勝手に閉じてしまわないようにするため
            Console.ReadLine();
        }

        /// <summary>
        /// Q5)配列のソート(昇順)
        /// </summary>
        public static void NumbersSortAsc(int[] numbers)
        {
            // ★ここを実装!★
        }
    }
}

解答

using System;

namespace Algorithm_05
{
    public class Program
    {
        static void Main(string[] args)
        {
            // 配列の用意
            int[] numbers = { 3, 4, 1, 6, 5, 4, 1, 9, 2, 3 };

            // 表示
            Console.WriteLine("ソート前:[{0}]", string.Join(",", numbers));

            // 関数の呼び出し
            NumbersSortAsc(numbers);

            // 表示
            Console.WriteLine("ソート後:[{0}]", string.Join(",", numbers));

            // ※コンソールが勝手に閉じてしまわないようにするため
            Console.ReadLine();
        }

        /// <summary>
        /// Q5)配列のソート(昇順)
        /// </summary>
        public static void NumbersSortAsc(int[] numbers)
        {
            for (int i = 0; i < numbers.Length - 1; i++)
            {
                for (int j = 0; j < numbers.Length - i - 1; j++)
                {
                    // 前の数字が後ろの数字よりも大きい場合は入れ替える
                    if (numbers[j] > numbers[j + 1])
                    {
                        int x = numbers[j];
                        numbers[j] = numbers[j + 1];
                        numbers[j + 1] = x;
                    }
                }
            }
        }
    }
}

Q6)文字列の反転

問題

与えられた文字列を逆順にする関数を実装してください。

出力例)

文字列を入力してください:こんにちは!むらまさです!
反転前:こんにちは!むらまさです!
反転後:!すでさまらむ!はちにんこ

using System;
using System.Text;

namespace Algorithm_06
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // ユーザーに入力要求
            Console.Write("文字列を入力してください:");
            string targetString = Console.ReadLine();

            // 表示
            Console.WriteLine("反転前:{0}", targetString);

            // 関数の呼び出し
            string reverseString = ReverseString(targetString);

            // 表示
            Console.WriteLine("反転後:{0}", reverseString);

            // ※コンソールが勝手に閉じてしまわないようにするため
            Console.ReadLine();
        }

        /// <summary>
        /// Q6)文字列の反転
        /// </summary>
        public static string ReverseString(string targetString)
        {
            // ★ここに実装!★
        }
    }
}

解答例

using System;
using System.Text;

namespace Algorithm_06
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // ユーザーに入力要求
            Console.Write("文字列を入力してください:");
            string targetString = Console.ReadLine();

            // 表示
            Console.WriteLine("反転前:{0}", targetString);

            // 関数の呼び出し
            string reverseString = ReverseString(targetString);

            // 表示
            Console.WriteLine("反転後:{0}", reverseString);

            // ※コンソールが勝手に閉じてしまわないようにするため
            Console.ReadLine();
        }

        /// <summary>
        /// Q6)文字列の反転
        /// </summary>
        public static string ReverseString(string targetString)
        {
            // 反転後の文字列
            StringBuilder reverseString = new StringBuilder();

            // 引数として受け取った文字列の最後尾から文字を取得して、反転後の文字列を作っていく
            for (int i = targetString.Length - 1; i >= 0; i--)
            {
                reverseString.Append(targetString[i]);
            }

            // StringBuilder型をString型に変化して返す
            return reverseString.ToString();
        }
    }
}

Q7)最大公倍数

与えられた2つの整数値の最大公約数を計算する関数を実装してください。

現在準備中です…

コメント