我一开始的思路是使用BigInteger来存放斐波那契数,逐个计算上去,判断前九个数字和最后九个数字是否是由1-9组成的。 不过我发现程序很慢,用Visual Studio分析了一下程序的性能,发现BigInteger.Log10和BigInteger.Pow非常耗时。我用BigInteger.Log10计算出数字的长度L,然后除以BigInteger.Pow(10, L - 9)得到最前面的九个数字。 稍微改变了一下策略,先判断最后九个数字,后判断前九个数字。速度提高很多,因为判断最后九个数字,只要模10的九次方就行了,比计算长度再除快非常多,而需要进行后一个判断的几率很小。于是乎,大约30s能解决。 能不能再快一点呢?我发现BigInteger的模运算也挺慢的。其实我可以用一个长度为九的数组进行最后九位的加法,然后判断是否是由1-9九个数字组成就好。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
privatestaticint[] Add(int[] fn_1, int[] fn_2) { int[] ret = newint[9]; int n1 = fn_1.Length - 1; int n2 = fn_2.Length - 1; int nr = ret.Length - 1; int carry = 0; for (; nr >= 0; n1--, n2--, nr--) { int a = n1 >= 0 ? fn_1[n1] : 0; int b = n2 >= 0 ? fn_2[n2] : 0; int sum = a + b + carry; ret[nr] = sum % 10; carry = sum / 10; }
return ret; }
判断是否是由数字1-9组成也很简单。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
privatestaticboolIsPandigitalFibonacci(int[] fn) { int[] digitalCounts = newint[10]; for (int i = 0; i < 9; i++) { digitalCounts[fn[i]]++; }
for (int i = 1; i < 10; i++) { if (digitalCounts[i] != 1) { returnfalse; } }