国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

FizzBuzzWhizz游戲的高效解法

2019-11-17 03:11:08
字體:
供稿:網(wǎng)友

FizzBuzzWhizz游戲的高效解法

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

可以把這道題轉(zhuǎn)換成給100個(gè)人發(fā)紙牌的游戲,每人所報(bào)的就是紙牌上寫的東西。

紙牌發(fā)放時(shí)有優(yōu)先級(jí)的:

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

有紙牌的同學(xué)就不再給了。

假設(shè)三個(gè)數(shù)字分別為a,b,c,那么以上的優(yōu)先級(jí)的特點(diǎn)就是:

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

10以內(nèi)的最小公倍數(shù)比較好計(jì)算,也不用從1到100的掃描,感覺會(huì)更快一些。

跟文藝青年的代碼做了一下對(duì)比:

源碼(有點(diǎn)亂,多擔(dān)待):

    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("結(jié)果相等");             }            else            {                Console.WriteLine("結(jié)果不相等");             }                        DateTime dt = DateTime.Now;            for (int i = 0; i < 10000; i++)            {                Test1(s2);            }            TimeSpan ts = DateTime.Now - dt;            Console.WriteLine("文藝青年耗時(shí):"+ts.TotalMilliseconds);            DateTime dt2 = DateTime.Now;            for (int i = 0; i < 10000; i++)            {                Test2(s2);            }            TimeSpan ts2 = DateTime.Now - dt2;            Console.WriteLine("屌絲青年耗時(shí):" + 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

還可以再優(yōu)化,拋磚引玉吧!


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 东丰县| 谢通门县| 霍州市| 阿图什市| 新龙县| 金川县| 洛川县| 敦化市| 威海市| 专栏| 夏邑县| 榆中县| 金湖县| 大竹县| 漾濞| 辽阳县| 新民市| 安阳县| 上林县| 合川市| 色达县| 密山市| 和平区| 子洲县| 南城县| 额尔古纳市| 武胜县| 伊春市| 绥宁县| 交城县| 璧山县| 周至县| 共和县| 安福县| 小金县| 连江县| 宝山区| 马公市| 锦屏县| 海盐县| 基隆市|