rt
(笔试题)求n!

解决方案 »

  1.   

    int t = 1;
    for(int i=2; i<n; i++)
       t = t * i;
    System.out.println(t);n如果过大就会溢出
      

  2.   


    public long getNNNN(int n) {
      long result = 1;
      for (int i=n; i>0; i--) {
         result = result * i;
      }
      return result;
    }
      

  3.   


    public class Test {
      public double getN(double n) {
        if (n == 1)
          return 1;
        else
          return (n * getN(n - 1));
      }
      public static void main(String[] args) {
        double a = 10;
        System.out.println(getN(a));
      }
    }
    没测试,呵呵。
      

  4.   

    以下是递归实现:
    分析如下;
    n!=n*(n-1)!
    (n-1)!=(n-1)*(n-2)!
    ....
    0!=1
    可以得出:public static int func(int i) {
    if (i == 0 || i == 1) {
    return 1;
    }
    return i * func(--i);
    }
    不使用递归的代码如下:public static int func1(int i) {
    int res = 1;
    for (; i > 0; i--) {
    res *= i;
    }
    return res;
    }
      

  5.   

    public long factorial(int num) {
        long result = 1L;
        while(num > 1) {
            result *= num--;
        }
        return result;
    }
      

  6.   

    递归很方便:
    public class Test{
    public int getN(int n){
       if(n==0 || n==1) return 1;
       return n*getN(n-1);
    }
    public static void main(String[] args){
       int result = new Test().getN(5);//例如N=5
       System.out.println(result);
    }
    }
      

  7.   

    n不能大于17,超过17int就溢出,需要先判断
    if(n<0 && n>17)
    {}
    else
    {}
    超过17,用BigDecimal
      

  8.   

    给出一段简单的Ruby代码,顺便搞定18!
    a, n = 1, 18
    (2..n).each{|i| a *= i}
    p a
      

  9.   

    为什么没有一个人给出不限定n范围的解答?
    结果溢出?溢出就没有结果了?程序就算不出来了?计算机的功能也太少点了吧……
    一定要用int/long来存放最终结果?
    没有人给出溢出后的解决方案
    悲哀啊……那么多答案……
      

  10.   

    用递归是硬道理public long getEstate(int num){
      if (num <= 1)
         return 1;
      else 
         return num * getEstate(num - 1);

    ----
    提示:以上不考虑负数~
      

  11.   

    很久以前,用c写过一个用数组存,求阶乘的方法。
    可以支持到求5000的阶乘。不知对楼主有没有帮组;#include "stdio.h"
    #define N 250000 /*定义数组存储的最大位数*/
    void main()
    {int a[N],num,c,d,i,j;
    while(1){
    printf("请输入数字:");
    scanf("%d",&num);
    for(j=0;j<N;j=j+1){
    a[j]=0;}/*数组内元素初始赋值为0*/

    c=num;i=0;
    while(c!=0){
    d=c%10;
    a[i]=d;
    c=(c-d)/10;
    i=i+1;}/*将要求阶乘的数逆序存储在数组中*/

    for(i=num-1;i>1;i=i-1){
    for(j=0;j<N;j=j+1){
    a[j]=a[j]*i;}
    for(j=0;j<N;j=j+1){
    if(a[j]>=10){
    a[j+1]=a[j+1]+a[j]/10;
    a[j]=a[j]%10;}}
    }/*计算阶乘*/
    for(i=N-1;i>-1;i=i-1){
    if(a[i]!=0)
    break;}/*从数组尾端开始,找到第一个不为0的元素的位置*/
    printf("该数字阶乘=");
    for(j=i;j>-1;j=j-1){
    printf("%d",a[j]);}
    printf("\n");
    printf("--------------------------------------------------------------------------------");
    printf("\n");/*输出计算后的结果*/
    }
    }