阶乘很简单?说实话,这几道阶乘相关面试题你还真不一定懂! (2)

采用这种方法的话,两个大整数相乘的时间复杂度为 O(n),其实还有更快的方法,大概时间复杂度是 O(n^1.6),不过代码有点小复杂,感兴趣的可以阅读这篇文章:漫画:如何实现大整数相乘?,我这里就不展开说了,不然单独这个就可以另起一篇很长的文章了。

知道了两个大整数相乘之后,我们再来算我们的阶乘,就好做了,我们每次相乘的时候,只需要把它当作两个大整数重复乘就可以了。代码如下:

// N 的阶乘 public static String f(int n) { String s = "1"; Integer t = null; for (int i = 2; i <= n; i++) { t = i; s = 大整数相乘.mul(s,t.toString()); } return s; } // 大整数相乘 public static String mul(String s1, String s2) { // 先把字符串转化为 字符数组。 char[] c1 = s1.toCharArray(); char[] c2 = s2.toCharArray(); int len = c1.length + c2.length; // 用来存放两个数的积,字符的初始值为 '\u0000',也就是 0 char[] c = new char[len]; // 由于大整数的低位是在字符串的末尾,所以我们从末尾遍历来计算 for (int i = c1.length - 1; i >= 0; i--) { int index = len - 1; int res = 0;//用来存放进位 for (int j = c2.length - 1; j >= 0; j--) { int temp = (c1[i]-'0') * (c2[j]-'0') + c[index] + res; res = temp / 10; c[index--] = (char)(temp % 10); } // 每趟乘下来的进位要进行保存。 c[index] = (char)res; len--; } // 最后把c中的字符加上 '0' for (int i = 0; i < c.length; i++) { c[i] += '0'; } String s = new String(c); // n位数乘以m位数得到积位 (m+n)位数或者(n+m-1)位数 // 我们只需要判断c[0]是否为0,为0则把它舍弃。 if(c[0] == '0') return s.substring(1); else return s; }

时间复杂度是 O(n^3)。如果要优化的话,主要是在大整数相乘这里进行优化。

总结

是不是觉得,阶乘也没有那么简单了?这三道与阶乘相关的题,应该是比较常见的题吧,今天跟大家分享一波,希望大家有时间的话,自己也用代码实现一下,特别是算 N!。后面会继续跟大家分享一些我觉得不错的算法题,敬请关注。

最后推广下我的公众号:苦逼的码农:戳我即可关注,文章都会首发于我的公众号,期待各路英雄的关注交流。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpssss.html