高精度运算——大数阶乘、排列、组合
2011-11-12 20:07
337 查看
package org.sugite.tools; import java.util.Arrays; /* * @topic:求1000以内的阶乘、排列、组合 */ public class HighPrecision { private static int[] a = new int[2570];// 存放被乘数与最后的乘积 private static int[] b = new int[2570];// 存放除法过程中的商 private static int k, s, i, j, w;// k为a中的位数,w为进位值,s为余数 public static void main(String[] args) throws Exception { // System.out.println("Hello Landor!"); // factorial(1000); // for (i = k; i > 0; i--) { // System.out.print(a[i]); // } } /* 求阶乘方法 */ public static int[] factorial(int n) throws Exception { Arrays.fill(a, 0); cumprod(n, 2); return a; } /* 求排列方法 */ public static int[] arrangement(int m, int n) throws Exception { Arrays.fill(a, 0); cumprod(m, m - n + 1); return a; } /* 求组合方法 */ public static int[] combination(int m, int n) throws Exception { Arrays.fill(a, 0); Arrays.fill(b, 0); cumprod(m, m - n + 1); for (i = 2; i <= n; i++) {// 依次除以2、3、...、n s = 0; // 第一次除法前无余数 for (j = k; j >= 1; j--) {// 从最高位第k位开始除 s = a[j] + s * 10; // s为单项被除数 b[j] = s / i; // b[j]存商 s %= i; } while (b[k] == 0) // 去掉高位无意义的0 k--; for (j = 1; j <= k; j++) a[j] = b[j]; } return a; } /* 连乘方法,返回m*(m-1)*...*(n+1)*n的值 */ private static void cumprod(int m, int n) throws Exception { if (m < n)// m必须>=n throw new Exception(); k = 0; s = m; while (s != 0) { k++; a[k] = s % 10; s /= 10; }// 将m的各位数依次放入a中 for (i = m - 1; i >= n; i--) { w = 0; for (j = 1; j <= k; j++) { a[j] = a[j] * i + w;// 乘数i与各位相乘,加进位值 w = a[j] / 10;// 计算应进位的值 a[j] %= 10; } while (w != 0) { k++; a[k] = w % 10; w /= 10; }// 分离最后进位数到数组高位 } } }
可以自己根据情况调整数组大小来获得更大数的阶乘、排列和组合
相关文章推荐
- 阶乘、排列,组合的高精度运算
- 高精度阶乘、乘方排列组合
- SGU247(排列组合与大数运算)
- hdu4927 Series 1(组合+公式 Java大数高精度运算)
- hdu4927 Series 1(组合+公式 Java大数高精度运算)
- 高精度阶乘(大数运算)
- 高精度模板 大数的基本运算
- (高精度运算4.7.21)UVA 10106 Product(大数乘法)
- (高精度运算4.7.29)SGU 112 a^b - b^a(大数的幂运算)
- 阶乘、排列、组合 公式计算
- C语言实现的阶乘,排列和组合实例
- 高精度运算(大数)
- 高精度运算 大数加法
- 九度OJ 1076 N的阶乘 (高精度大数的乘法)
- php算法 阶乘、排列、组合
- Python2.7基于笛卡尔积算法实现N个数组的排列组合运算示例
- 高精度运算 加减乘除阶乘幂
- 使用java实现数学中的排列组合公式A和C以及阶乘
- 高精度运算之阶乘
- 阶乘、排列、组合 公式计算