一个整型变量只能用来存贮较小的 N!的值,当 N 较大时,可将阶乘值中的每一个数字
放在一个一维数组的一个元素中。使用这方法,任选 Objective-C/C/C++/Java 之一打印:
① N!的值;
② N!-M!(M>N);
③ N!+M!
放在一个一维数组的一个元素中。使用这方法,任选 Objective-C/C/C++/Java 之一打印:
① N!的值;
② N!-M!(M>N);
③ N!+M!
解决方案 »
- 求助!java读取word格式,比如章节名等
- 谁帮忙解释一下这个错误的产生 感激不尽
- JTree getValueAt为什么取到的最后一个单元格的值为null?如何取得所有的值
- 谁有java2d初学的资料还有3d的
- java.lang.OutOfMemoryError 求教
- 一个class运行时,怎么知道该class是被谁调用的?
- 请教一道java访问oracle,并且输出表中全部内容的编程问题
- 望高人指点一二,感激不尽!
- 请问如何调用命令行程序,并保持其窗口不关闭
- Java提问
- 获取数据库内容时出现问题,望大侠们帮助!感激不尽
- String s = new String("abc")和Integer i = new Integer(123)区别
题目的意思是 比方说7!=5040 可以存在数组里表示 int[] a =new int[]{5,0,4,0};
或者String a="5040";
当N!所产生的值 在数据基本类型里放不下的时候 可以 用数组 存放 通过这种思想进行大数运算
class Test {
public static void main(String[] args) throws Exception {
int[] result = calN(5);
System.out.println(Arrays.toString(result).replaceAll("\\D+", ""));
} public static int[] calN(int n) {
if (n < 0) return new int[]{-1};
if (n < 2) return new int[]{1};
int[] result = new int[]{1}; //这里可以先算N阶乘结果可能的最大长度
//然后直接new一个和该长度相同长度的数组
//在这里偷懒,所以每次自己加长数组长度,这样效率较差
//但是只是为了说明算法
for (int i=1; i<=n; i++) {
for (int j=result.length-1; j>=0; j--) { //数组每位相乘
result[j] *= i;
}
for (int j=result.length-1; j>0; j--) { //数组进位
result[j-1] += (result[j]/10);
result[j] %= 10;
}
if (result[0] > 9) { //最高位大于9,变长数组
int cnt = String.valueOf(result[0]).length()-1;
int[] tmp = new int[result.length+cnt];
System.arraycopy(result, 1, tmp, cnt+1, result.length-1);
while (result[0] > 10) {
tmp[cnt--] = result[0] % 10;
result[0] /= 10;
}
tmp[0] = result[0];
result = tmp;
}
}
return result;
}
}这里只给了阶乘的例子,至于加减法,LZ从例子里自己体会吧,其实就是M每次取后一个数字出来和数组相应的位置的数进行加减
M的每个数字如何取?
int lastNumber = M%10; //取最后一个数字
M /= 10; //然后M除以10
把这个过程放到数组循环中就可以了,提示已经给到这里,基本上没什么难点了,LZ慢慢体会吧。