最近比較火的一道題(傳送門),看見園友們的談論(傳送門1 傳送門2),都是從1到100的掃描,我想說說的另一種想法。
可以把這道題轉換成給100個人發紙牌的游戲,每人所報的就是紙牌上寫的東西。
紙牌發放時有優先級的:
- Fizz
- FizzBuzzWhizz
- FizzBuzz
- FizzWhizz
- BuzzWhizz
- Fizz、Buzz、Whizz
- 自己的數字
有紙牌的同學就不再給了。
假設三個數字分別為a,b,c,那么以上的優先級的特點就是:
- Fizz(含有數字a的)
- FizzBuzzWhizz(a,b,c的最小公倍數的整數倍)
- FizzBuzz(a,b的最小公倍數的整數倍)
- FizzWhizz(a,c的最小公倍數的整數倍)
- BuzzWhizz(b,c的最小公倍數的整數倍)
- Fizz、Buzz、Whizz(a,b,c的整數倍)
- 自己的數字(剩下的)
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)); } }
還可以再優化,拋磚引玉吧!