前一段时间swing & swt群里一个大牛叫我用自己的方法写个大数的阶乘,前一段时间抽了一点时间,写出来了,效率不太好,现在贴出来共享下,希望csdn中的大牛们来给我优化优化,提出更优美的算法,恶哈哈! pckage org.loonsoft.test; import java.util.Scanner; public class BigIntegerFac { /** * 处理大数相加 * * @param a * @param b * @return a+b结果 */ private static StringBuilder add(String a, String b) { StringBuilder sb = new StringBuilder(); int len1 = a.length(); int len2 = b.length(); if (len1 > len2) { String temp = a; a = b; b = temp; int len = len1; len1 = len2; len2 = len; } int c = 0; // 进位 for (int i = a.length() - 1; i >= 0; --i) { int aa = Integer.parseInt(String.valueOf(a.charAt(i))); int bb = Integer.parseInt(String.valueOf(b.charAt(len2 - 1))); int cc = aa + bb + c; if (cc >= 10) { c = cc / 10; sb.append(cc % 10); } else { sb.append(cc); c = 0; } --len2; } for (int i = len2 - 1; i >= 0; --i) { int aa = Integer.parseInt(String.valueOf(b.charAt(i))); int bb = c; int cc = aa + bb; if (cc >= 10) { c = cc / 10; sb.append(cc % 10); } else { sb.append(cc); c = 0; } } if (c > 0) sb.append(c); return sb.reverse(); } /** * 处理大数相乘 * * @param a * @param b * @return a*b */ private static String mutiply(String a, String b) { StringBuilder ans1 = new StringBuilder(); StringBuilder ans2 = new StringBuilder(); int len1 = a.length(); int len2 = b.length(); int r = 1;// 控制做加法的时候的缩进 // System.out.println(len1 + " " + len2); for (int i = len2 - 1; i >= 0; --i) { int bb = Integer.parseInt(String.valueOf(b.charAt(i))); int c = 0; // 保存进位 for (int j = len1 - 1; j >= 0; --j) { int aa = Integer.parseInt(String.valueOf(a.charAt(j))); int cc = aa * bb + c; // System.out.println(cc); if (cc >= 10) { c = cc / 10; ans1.append(cc % 10); } else { ans1.append(cc); c = 0; } } if (c > 0) ans1.append(c); if (i == len2 - 1) { ans2 = ans2.append(ans1.reverse()); } else { StringBuilder temp = ans1.reverse(); int tmpR = r; while (tmpR > 0) { temp.append(0); --tmpR; } ++r; ans2 = add(temp.toString(), ans2.toString()); } ans1.delete(0, ans1.length()); } return ans2.toString(); } /** * 求阶乘 * * @param n * @return n! */ public static String getFac(int n) { String fac = "1"; for (int i = 1; i <= n; ++i) { fac = mutiply(fac, String.valueOf(i)); } return fac.toString(); } public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNext()) { int n = sc.nextInt(); // long b = System.currentTimeMillis(); System.out.println(getFac(n)); // System.out.println(System.currentTimeMillis() - b); } } }