[c#]取得格雷碼Gray code

  • 72
  • 0

取得格雷碼Gray code

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

namespace ex1
{
    static class Program
    {
        /// <summary>
        ///  The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            int n = 0;
            do
            {
                Console.Write("input number :");
                 n = int.Parse(Console.ReadLine());
                getGraycode_step(n);
                getGraycode_stack(n);
                getGraycode_shift(n);
            } while (n > 0);


        }
        /// <summary>
        /// 逐一字元比對
        /// </summary>
        /// <param name="n"></param>
        static void getGraycode_step(int n)
        {

            char[] graycode = ("0".PadRight(n, '0')).ToCharArray();
            char[] binary = ("0".PadRight(n, '0')).ToCharArray();


            Console.WriteLine(0 + " " + string.Join("", binary) + " " + string.Join("", graycode));

            for (int i = 1; i < Math.Pow(2, n); i++)
            {
                int b_index = binary.Length - 1;
                while (binary[b_index].Equals('1') && b_index > 0)
                {
                    binary[b_index] = '0';
                    b_index--;

                }
                binary[b_index] = '1';
                graycode[b_index] = binary[b_index];

                for (int g_index = graycode.Length - 1; g_index > 0; g_index--)
                {
                    graycode[g_index] = binary[g_index].Equals(binary[g_index - 1]) ? '0' : '1';
                }

                Console.WriteLine(i + " " + string.Join("", binary) + " " + string.Join("", graycode));
            }
        }

        /// <summary>
        /// 使用堆疊Stack
        /// </summary>
        /// <param name="n"></param>
        static void getGraycode_stack(int n = 4)
        {
            Stack<int> graycode = new Stack<int>();
            List<int> tgraycode = new List<int>();
  
            graycode.Push(0);
            for (int i = 0; i <= n; i++)
            {
                int addint = tgraycode.Count();
                while (graycode.Count > 0)
                {
                    tgraycode.Add(graycode.Pop() + addint);
                }

                for (int listindex = 0; listindex < tgraycode.Count; listindex++)
                {
                    graycode.Push(tgraycode[listindex]);

                }

            }

            //Console.WriteLine("G:" + string.Join(" ", graycode.ToArray()));
            Console.WriteLine("T:" + string.Join(" ", tgraycode.ToArray()));

        }

        /// <summary>
        /// 移位運算
        /// </summary>
        /// <param name="n"></param>
        static void getGraycode_shift(int n)
        {
            List<int> result = new List<int>();
            for (int i = 0; i < (1 << n); i++)
            {
                result.Add(i ^ (i >> 1));
            }

            Console.WriteLine("G:" + string.Join(" ", result.ToArray()));

        }

    }
}