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

prob8-11

長さ10の整数型の配列変数を2つ用意し、それぞれに、各要素に1から10の整数を代入し、以下のようにそれぞれの配列に共通する値の一覧のみが入った配列と、2つのうちどちらかに入る数値の一覧を小さい準に代入した配列を作りなさい。

例 配列1:  4  9  4  3  6  8  7  1  3  10 配列2:  7  3  10  7  5  9  4  9  9  1 共通の数:1  3  4  7  9  10 どちらか入っている数:1  3  4  5  6  7  8  9  10

考え方のポイント

共通の数やどちらかはいっている数の配列を作るために配列の長さを求め配列をつくってから数を入れます。共通の数やどちらかはいっている数を見つけるのに1から10まで数字ごとに検索しています。(例えば1は配列1,2の中にあるのかどうか。)あればカウント1とし、なければ0のままで検索が終わってから1の場合は配列に入れています。

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

namespace prob8_11__2
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] hi1 = new int[10];
            int[] hi2 = new int[10];
            Random r = new Random();
            for(int i = 0; i < 10; i++)
            {
                hi1[i] = r.Next(1, 11);
            }
            for (int i = 0; i < 10; i++)
            {
                hi2[i] = r.Next(1, 11);
            }

            //配列1,2を書き出し
            Console.Write("配列1:"); 
            foreach(int i in hi1)
            {
                Console.Write("{0} ", i);
            }
            Console.WriteLine();
            Console.Write("配列2:");
            foreach (int i in hi2)
            {
                Console.Write("{0} ", i);
            }
            Console.WriteLine();

            //1から10の数字があるかどうか検索
            int cnt1 = 0; //共通 あれば1に
            int cnt2 = 0; //どちらか あれば1に
            int cnt11 = 0; //共通の個数
            int cnt22 = 0; //どちらかの個数
            for (int i = 1; i < 11; i++)
            {
                foreach (int j in hi1)
                {
                    foreach(int k in hi2)
                    {
                        if (i == j && i==k)//共通の数があるかどうか あれば共通にもどちらかにも
                        {
                            cnt1 = 1;
                            cnt2 = 1;
                        }
                        else if(i == k)
                        {
                            cnt2 = 1; 
                        }
                    }
                    if(i==j && cnt2 == 0)
                    {
                        cnt2 = 1;
                    }
                    
                }
                if (cnt1 == 1)
                {
                    cnt11++;
                }
                cnt1 = 0; //次の数に行くのでリセット
                if (cnt2 == 1)
                {
                    cnt22++;
                }
                cnt2 = 0;

            }

            //配列の長さが決まったので配列に入れていく
            int[] kyo = new int[cnt11];
            int[] doti = new int[cnt22];
            int kazu1 = 0;
            int kazu2 = 0;
            for (int i = 1; i < 11; i++)
            {
                foreach (int j in hi1)
                {
                    foreach (int k in hi2)
                    {
                        if (i == j && i == k)
                        {
                            cnt1 = 1;
                            cnt2 = 1;
                        }
                        else if (i == k)
                        {
                            cnt2 = 1;
                        }
                    }
                    if (i == j && cnt2 == 0)
                    {
                        cnt2 = 1;
                    }

                }
                if (cnt1 == 1)
                {
                    kyo[kazu1] = i;
                    kazu1++;
                }
                cnt1 = 0;
                if (cnt2 == 1)
                {
                    doti[kazu2] = i;
                    kazu2++;
                }
                cnt2 = 0;

            }
            Console.Write("共通の数:");
            foreach (int i in kyo)
            {
                Console.Write("{0} ", i);
            }
            Console.WriteLine();
            Console.Write("どちらか入っている数:");
            foreach (int i in doti)
            {
                Console.Write("{0} ", i);
            }
            Console.WriteLine();
        }
    }
}

私にとってかなり難問でした。とりあえず解けましたがもっといい解き方があるかもしれません。