大数问题:求n的阶乘
Posted jhcelue
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数问题:求n的阶乘相关的知识,希望对你有一定的参考价值。
题目:求100!
这看起来是一个非常简答的问题,递归解之毫无压力
int func(int n){ if(n <= 1) return 1; else return n*func(n-1); }但你会发现,题目真的有这么简单吗,考虑整形数据越界没有?
这实际上是一个大数问题!
大数怎么表示呢,非常直接的。我们会想到用字符串来表示。但表示的过程中还得做阶乘运算。是不是想象的那么复杂呢?
事实上。用主要的乘法运算思想(从个位到高位逐位相乘,进位)来考虑,将暂时结果的每位与阶乘元素相乘。向高位进位。问题并非那么复杂。
代码中凝视非常具体,不多说,直接贴在以下了。
public static void main(String[] args) throws IOException { int digit = 1; // 位数 int temp; // 阶乘的任一元素与暂时结果的某位的乘积结果 int i, j, carry; // 进位 boolean isnavigate = false; // 输入的数是正数还是负数 int[] a = new int[3000]; // 确保保存终于运算结果的数组足够大 System.out.println("请输入一个数字,求它的阶乘"); String nStr = ClassicalIOCode.getSystemInput(); int n = 1; try { n = Integer.parseInt(nStr); }catch(NumberFormatException nfe) { System.out.println("请输入合法的正整数!"); return; } if(n < 0) { n = -n; isnavigate = true; } a[0] = 1; // 将结果先初始化为1 for (i = 2; i <= n; i++) { // 開始阶乘,阶乘元素从2開始依次"登场" // 按最主要的乘法运算思想(从个位到高位逐位相乘。进位)来考虑,将暂时结果的每位与阶乘元素相乘 for (j = 1, carry = 0; j <= digit; j++) { // carry:进位 temp = a[j - 1] * i + carry; // 对应阶乘中的一项与当前所得暂时结果的某位//相乘(加上进位) a[j - 1] = temp % 10; // 更新暂时结果的位上信息 carry = temp / 10; // 看是否有进位 } while (carry != 0) { // 假设有进位 a[++digit - 1] = carry % 10; // 新加一位,加入信息。位数增1 carry = carry / 10; // 看还能不能进位 } } if(isnavigate) { if(n % 2 == 1) { System.out.print((-n) + "的阶乘:"+ (-n) +"! = -"); // 显示结果 }else { System.out.print((-n) + "的阶乘:"+ (-n) +"! = "); // 显示结果 } }else { System.out.print(n + "的阶乘:"+ n +"! = "); // 显示结果 } for (j = digit; j >= 1; j--) { System.out.print(a[j - 1]); } System.out.println(); }
以上是关于大数问题:求n的阶乘的主要内容,如果未能解决你的问题,请参考以下文章
51 Nod 1008 N的阶乘 mod PJava大数乱搞
2017/7/31-zznu-oj-问题 B: N! 普拉斯 -求大数的阶乘-ll存不下-然后取尾零的个数输出-暴力模拟