FizzBuzzWhizz游戲的高效解法


最近比較火的一道題(傳送門),看見園友們的談論(傳送門1 傳送門2),都是從1到100的掃描,我想說說的另一種想法。

可以把這道題轉換成給100個人發紙牌的游戲,每人所報的就是紙牌上寫的東西。

紙牌發放時有優先級的:

  1. Fizz
  2. FizzBuzzWhizz
  3. FizzBuzz
  4. FizzWhizz
  5. BuzzWhizz
  6. Fizz、Buzz、Whizz
  7. 自己的數字

有紙牌的同學就不再給了。

 

假設三個數字分別為a,b,c,那么以上的優先級的特點就是:

  1. Fizz(含有數字a的)
  2. FizzBuzzWhizz(a,b,c的最小公倍數的整數倍)
  3. FizzBuzz(a,b的最小公倍數的整數倍)
  4. FizzWhizz(a,c的最小公倍數的整數倍)
  5. BuzzWhizz(b,c的最小公倍數的整數倍)
  6. Fizz、Buzz、Whizz(a,b,c的整數倍)
  7. 自己的數字(剩下的)

10以內的最小公倍數比較好計算,也不用從1到100的掃描,感覺會更快一些。

文藝青年的代碼做了一下對比:

 

附源碼(有點亂,多擔待):

    class Program
    {
        static void Main(string[] args)
        {
            //string[] s1 = Console.ReadLine().Split(',');
            Test("3,5,7");
            Test("2,4,8");
            Test("3,6,8");
            Console.ReadKey();
        }

        static void Test(string str)
        {
            Console.WriteLine(str);
            string[] s1 = str.Split(',');
            int[] s2 = new int[] { int.Parse(s1[0]), int.Parse(s1[1]), int.Parse(s1[2]) };
            string[] r1 = Test1(s2);
            string[] r2 = Test2(s2);
            bool flag = true;
            for (int i = 0; i < 100; i++)
            {
                if (r1[i] != r2[i])
                {
                    flag = false;
                    break;
                }
            }
            if(flag)
            {
               Console.WriteLine("結果相等"); 
            }
            else
            {
                Console.WriteLine("結果不相等"); 
            }
            

            DateTime dt = DateTime.Now;
            for (int i = 0; i < 10000; i++)
            {
                Test1(s2);
            }
            TimeSpan ts = DateTime.Now - dt;
            Console.WriteLine("文藝青年耗時:"+ts.TotalMilliseconds);

            DateTime dt2 = DateTime.Now;
            for (int i = 0; i < 10000; i++)
            {
                Test2(s2);
            }
            TimeSpan ts2 = DateTime.Now - dt2;
            Console.WriteLine("屌絲青年耗時:" + ts2.TotalMilliseconds);
            Console.WriteLine();
        }

        private static string[] Test1(int[] a)
        {
            string[] result = new string[100];
            for (int i = 1; i <= 100; i++)
            {
                result[i - 1] = (i % a[0] == 0 ? "Fizz" : "") + (i % a[1] == 0 ? "Buzz" : "") + (i % a[2] == 0 ? "Whizz" : "") + ((i % a[0] != 0 && i % a[1] != 0 && i % a[2] != 0) ? i.ToString() : "");
            }
            for (int i = 0; i < 10; i++)
            {
                result[a[0] * 10 + i - 1] = result[i * 10 + a[0] - 1] = "Fizz";
            }
            return result;
        }

        private static string[] Test2(int[] a)
        {
            string[] result = new string[100];
            for (int i = 0; i < 10; i++)
            {
                result[a[0] * 10 + i - 1] = result[i * 10 + a[0] - 1] = "Fizz";
            }

            comp(result, nlcm(a, 3), "FizzBuzzWhizz");

            comp(result, lcm(a[0], a[1]), "FizzBuzz");
            comp(result, lcm(a[0], a[2]), "FizzWhizz");
            comp(result, lcm(a[1], a[2]), "BuzzWhizz");

            comp(result, a[0], "Fizz");
            comp(result, a[1], "Buzz");
            comp(result, a[2], "Whizz");

            for (int i = 1; i <= 100; i++)
            {
                if (string.IsNullOrEmpty(result[i - 1]))
                {
                    result[i - 1] = i.ToString();
                }
            }
            return result;
        }

        static void comp(string[] result, int temp, string str)
        {
            for (int i = 1; i * temp <= 100; i++)
            {
                if (string.IsNullOrEmpty(result[i * temp - 1]))
                {
                    result[i * temp - 1] = str;
                }
            }
        }

        static int gcd(int a, int b)
        {
            if (a < b)
                swap(ref a, ref b);
            if (b == 0)
                return a;
            else
                return gcd(b, a % b);
        }

        private static void swap(ref int a, ref int b)
        {
            int c = a;
            a = b;
            b = c;
        }

        static int ngcd(int[] a, int n)
        {
            if (n == 1) return a[0];
            return gcd(a[n - 1], ngcd(a, n - 1));
        }

        static int lcm(int a, int b)
        {
            return a * b / gcd(a, b);
        }

        static int nlcm(int[] a, int n)
        {
            if (n == 1)
                return a[0];
            else
                return lcm(a[n - 1], nlcm(a, n - 1));
        }
    }
View Code

 

還可以再優化,拋磚引玉吧!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM