java 大数阶乘(二)
来源:互联网 发布:excel数据在另一列分组 编辑:程序博客网 时间:2024/06/02 01:16
由于大数的阶乘的结果比较大,长整型是不能存储的下的,为了能实现这个功能,使用按位进行相乘,将没位的结果分开存放,最后输出,不过运算的速度有点慢,算2000!得好长时间,呵呵。思路如下:
24x5= 24 x 5 ------ 20 10 ------ 120
代码如下:
import java.util.List;import java.util.ArrayList;class BigFactorial{public static void main(String args[]){BigFactorial bigFactorial = new BigFactorial();if(args.length >= 1){List<Integer> resultList = bigFactorial.computeFactorial(Integer.parseInt(args[0]));System.out.print("" + Integer.parseInt(args[0]) + "! = ");for( int i = 0; i < resultList.size(); i++){if( i == 0 && resultList.get(0) == 0){}else{System.out.print("" + resultList.get(i));}}}}public List<Integer> computeFactorial(int paramNumber){List<Integer> localResult = new ArrayList<Integer>();if(paramNumber == 4){localResult.add(4);localResult.add(0, 2);return localResult;}else{List<Integer> multiplier = convertNumber(paramNumber);List<Integer> multiplicand = computeFactorial(paramNumber - 1);for(int i = multiplier.size() - 1; i >= 0; i--){for(int j = multiplicand.size() - 1; j >= 0; j--){int temp = 0;int result = multiplier.get(i) * multiplicand.get(j);if(result > 10){temp = result%10;result = result/10;}else{if(result == 10){result = 1;temp = 0;}else{temp = result;result = 0;}}if(localResult.size() == 0){localResult.add(temp);if(result != 0){localResult.add(0, result);}}else{int multiplierLength = multiplier.size() - 1 - i ;int multiplicandLength = multiplicand.size() - 1 - j;int insertNumber;int numberPast;if(multiplierLength == 0 || multiplicandLength == 0){numberPast = Math.max(multiplierLength, multiplicandLength);}else{numberPast = (multiplierLength + multiplicandLength);}insertNumber = localResult.size() - numberPast - 1;if(insertNumber == 0){int localParam1 = localResult.get(insertNumber) + temp;if(localParam1 >= 10){result = result + 1;localParam1 = localParam1%10;}localResult.set(insertNumber, localParam1);if(result != 0){localResult.add(0, result);}}else if(insertNumber == -1){localResult.add(0, temp);localResult.add(0, result);}else if(insertNumber == -2){localResult.add(0, 0);localResult.add(0, 0);localResult.add(0, temp);localResult.add(0, result);} else{int localParam2 = localResult.get(insertNumber) + temp;if(localParam2 >= 10){result++;localParam2 = localParam2%10;}localResult.set(insertNumber, localParam2);if(insertNumber == 0){localResult.add(0, result);}else{localResult.set(insertNumber - 1, (localResult.get(insertNumber - 1) + result));}}for( int r = localResult.size() - 1; r >= 0; r--){if(r == 0 && localResult.get(0) == 0){localResult.remove(0);}if(localResult.get(r) >= 10){int temp1 = localResult.get(r)%10;int result1 = localResult.get(r)/10;if(r == 0){localResult.set(0, temp1);localResult.add(0, 1);}else{localResult.set(r, temp1);localResult.set(r - 1, localResult.get(r - 1) + result1);}}}}}}return localResult;}}private List<Integer> convertNumber(int paramNumber){int remainder = paramNumber%10;int dValue = (paramNumber - remainder)/10;List<Integer> convertedNumber = new ArrayList<Integer>();convertedNumber.add(remainder);paramNumber = dValue;while(dValue != 0){if(dValue == 10){remainder = 0;dValue = 1;}else{remainder = paramNumber%10;convertedNumber.add(0, remainder);dValue = (paramNumber - remainder)/10;paramNumber = dValue;}}return convertedNumber;}}
- java 大数阶乘(二)
- 大数阶乘的计算(二)
- 大数阶乘的计算(二)
- java 大数的阶乘(一)
- 1063 JAVA大数阶乘
- 大数阶乘Java实现
- 大数阶乘Java
- JAVA大数阶乘
- java大数阶乘
- java 大数阶乘代码
- JAVA 大数阶乘
- 大数阶乘(nyoj28)
- 递推法(大数阶乘)
- 计算阶乘(大数)
- 大数阶乘(10000)
- JAVA 大数阶乘Java 例子:大数乘法和阶乘
- 计算大数阶乘--Java版
- Java 大数阶乘简单方法
- WCF 的 WebGet 方式
- MPD大会上所使用的PPT分享
- SQL多表查询行转列
- 八款开源Android游戏引擎
- 搜狐邮件中心 学习 基础库prototype
- java 大数阶乘(二)
- 从数据库(mysql)存取图片
- MediaPlayer
- Flash学习笔记之XmlManager加载策略
- Dom4j为XML文件要结点添加xmlns属性 .
- Hospital and healthy
- 苹果iPod销量不断下滑:iPhone和iPad争用户
- Windows API:GetUserName的用法
- Bitmap:bmWidthBytes以及Bitmap的详细说明