转自:http://blog.csdn.net/liyong199012/article/details/40341779
题目:求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;
- for (i = 2; i <= n; i++) {
-
- for (j = 1, carry = 0; j <= digit; j++) {
- temp = a[j - 1] * i + carry;
- a[j - 1] = temp % 10;
- carry = temp / 10;
- }
- while (carry != 0) {
- a[++digit - 1] = carry % 10;
- 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();
- }