N的结成

43 篇文章 0 订阅

转自:http://blog.csdn.net/liyong199012/article/details/40341779


题目:求100!

这看起来是一个很简答的问题,递归解之毫无压力

[java]  view plain  copy
  1. int func(int n){  
  2.     if(n <= 1return 1;  
  3.     else return n*func(n-1);  
  4. }  
但你会发现,题目真的有这么简单吗,考虑整形数据越界没有?

这实际上是一个大数问题!

大数怎么表示呢,很直接的,我们会想到用字符串来表示,但表示的过程中还得做阶乘运算,是不是想象的那么复杂呢?

其实,用基本的乘法运算思想(从个位到高位逐位相乘,进位)来考虑,将临时结果的每位与阶乘元素相乘,向高位进位,问题并不是那么复杂。

代码中注释很详细,不多说,直接贴在下面了。

[java]  view plain  copy
  1. public static void main(String[] args) throws IOException {  
  2.     int digit = 1;      // 位数  
  3.     int temp;           // 阶乘的任一元素与临时结果的某位的乘积结果  
  4.     int i, j, carry;                    // 进位  
  5.     boolean isnavigate = false;         // 输入的数是正数还是负数  
  6.     int[] a = new int[3000];            // 确保保存最终运算结果的数组足够大  
  7.     System.out.println("请输入一个数字,求它的阶乘");  
  8.     String nStr = ClassicalIOCode.getSystemInput();  
  9.     int n = 1;  
  10.     try {  
  11.         n = Integer.parseInt(nStr);  
  12.     }catch(NumberFormatException nfe) {  
  13.         System.out.println("请输入合法的正整数!");  
  14.         return;  
  15.     }  
  16.     if(n < 0) {  
  17.         n = -n;  
  18.         isnavigate = true;  
  19.     }  
  20.     a[0] = 1;                           // 将结果先初始化为1  
  21.     for (i = 2; i <= n; i++) {           // 开始阶乘,阶乘元素从2开始依次"登场"  
  22.         // 按最基本的乘法运算思想(从个位到高位逐位相乘,进位)来考虑,将临时结果的每位与阶乘元素相乘  
  23.         for (j = 1, carry = 0; j <= digit; j++) { // carry:进位  
  24.             temp = a[j - 1] * i + carry; // 相应阶乘中的一项与当前所得临时结果的某位//相乘(加上进位)  
  25.             a[j - 1] = temp % 10;       // 更新临时结果的位上信息  
  26.             carry = temp / 10;          // 看是否有进位  
  27.         }  
  28.         while (carry != 0) {            // 如果有进位  
  29.             a[++digit - 1] = carry % 10// 新加一位,添加信息。位数增1  
  30.             carry = carry / 10;         // 看还能不能进位  
  31.         }  
  32.     }  
  33.     if(isnavigate) {  
  34.         if(n % 2 == 1) {  
  35.             System.out.print((-n) + "的阶乘:"+ (-n) +"! = -"); // 显示结果  
  36.         }else {  
  37.             System.out.print((-n) + "的阶乘:"+ (-n) +"! = "); // 显示结果  
  38.         }  
  39.     }else {  
  40.         System.out.print(n + "的阶乘:"+ n +"! = "); // 显示结果  
  41.     }  
  42.     for (j = digit; j >= 1; j--) {  
  43.         System.out.print(a[j - 1]);  
  44.     }  
  45.     System.out.println();  
  46. }  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值