CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

菜鸟求一个解 N!的程序 (斑竹必进)

楼主fycom200(恋上C++)2004-09-01 21:46:04 在 C/C++ / C语言 提问

求一个解   N   的阶乘的程序   1<=N<=1000  
  斑竹来了请务必回一个,如果你的可以分照给不误,如果你瞧不起我那就求你别删我的贴就感激不尽!  
  那样非但对我不公平,对回答问题的朋友更是不公平 问题点数:20、回复次数:35Top

1 楼avalonBBS("︶.︶メ)→( ̄ε ̄メ)回复于 2004-09-01 21:48:39 得分 0

模拟累加~~~~用数组来存储Top

2 楼hcj2002(流浪者·躬自厚而薄责于人 )回复于 2004-09-01 21:54:05 得分 0

搜一下以前的贴子应该有Top

3 楼loveliu0429(lovelipei)回复于 2004-09-01 22:20:43 得分 0

晕死  
  这种问题似乎任何一本书都有吧  
  估计高手对这种帖子看都不看Top

4 楼xfxf521(天使也一样)回复于 2004-09-01 22:23:42 得分 0

是的啊!!这个问题也太简单了吧!!  
  int   i,num;  
  num=1;  
  for(i=1;i<=n;i++)  
    num=i*num;Top

5 楼fycom200(恋上C++)回复于 2004-09-01 22:34:25 得分 0

TO   xfxf521(天使也一样)   ,loveliu0429(lovelipei)   :  
  代码呢?没代码是不给分的,结果有误也不给,之前就因问题简单而被XX删了帖。  
  Top

6 楼Rino(清风摇影)回复于 2004-09-01 22:37:46 得分 0

是知道N的阶乘,求N,  
  还是知道N,求N的阶乘?  
  应该可以用递归来做的。  
   
  int   num;  
   
  f(int   n)  
  {  
          if(n   >   0)  
          {  
                if(n   !=   1)  
                {  
                        num   =   num   *   f(n--);  
                }  
                else    
                        num   =   1;  
                return   num;      
          }  
          else  
          return   -1;  
  }Top

7 楼fycom200(恋上C++)回复于 2004-09-01 22:42:26 得分 0

求   N   的阶乘Top

8 楼loveliu0429(lovelipei)回复于 2004-09-01 22:42:38 得分 0

TO   xfxf521(天使也一样)   ,loveliu0429(lovelipei)   :  
  代码呢?没代码是不给分的,结果有误也不给,之前就因问题简单而被XX删了帖。  
  呵呵,不给就算了,我也没办法  
  不过可能中了你的计了  
  ~~~~~~~~~~  
  Top

9 楼Rino(清风摇影)回复于 2004-09-01 22:55:43 得分 0

突然发现自己傻的可以……Top

10 楼qwerty2004(.The best answer to WHY is WHY NOT.)回复于 2004-09-01 23:07:40 得分 1

“代码呢?没代码是不给分的,结果有误也不给”  
   
  别人来帮助你并不是为了分数  
  如此斤斤计较你什么也学不到  
   
  建议搜索一下以前的帖子  
  这样的问题出现n次了Top

11 楼yanyanyanyan(言难尽)回复于 2004-09-01 23:11:18 得分 0

恐怕没有几个人能正确解答  
  这个结果太大了  
  如果一定要答案,还是查表吧  
  Top

12 楼yanyanyanyan(言难尽)回复于 2004-09-01 23:15:30 得分 0

windows   自带的计算器计算阶乘好像也是查表的Top

13 楼ftkghost(小鹏)回复于 2004-09-01 23:23:16 得分 0

这个题目不简单啊     999!    
  谁能弄出来?  
  long   int都存不下那么大的阿  
  Top

14 楼green2008(开始8年抗战!)回复于 2004-09-01 23:24:40 得分 0

main()  
      {   flost   t=1;  
          int   n;  
           
        for(n=1;n<=1000;n++)  
   
        {   t=t*n     }        
   
        printf("t=%d",t)  
        }Top

15 楼green2008(开始8年抗战!)回复于 2004-09-01 23:26:50 得分 0

可以吗?我是刚学C语言的!!不熟呀!!!Top

16 楼fanbest(座天使长)回复于 2004-09-01 23:32:40 得分 3

http://community.csdn.net/Expert/topic/3320/3320760.xml?temp=.1098902  
   
  去自己找找真的这么难么?:)  
   
  好多答案都是现成滴.Top

17 楼Ardor007(阿多)回复于 2004-09-02 00:32:50 得分 0

#define   N   1000  
  #include   <stdio.h>  
   
  void   main()  
  {  
  int   i;  
  int   n;  
  double   sum;  
   
  n   =   N;  
  sum   =   1.0;  
  for   (   i   =   1;   i   <=   N;   i++   )  
  {  
  sum   *=   i;  
  }  
  printf(   "%d!   =   %e\n",   n,   sum   );  
  }  
   
  程序编译运行出错,Floating   point   error:OverFlow.  
   
  然后我又用long   double   sum,还是不行,得到错误的值。用计算机算出来的值是4.02387260077093773543702433923e+2567,这么大的数,用一般的数据类型是根本存储不下的。这个问题的确有点难度。  
   
  不过以前已经有人讨论过了,见:  
   
  http://community.csdn.net/Expert/topic/3320/3320760.xml?temp=.1098902  
  Top

18 楼junmayang(笨猪)回复于 2004-09-02 08:45:35 得分 0

呵呵,我算出来了,不过结果是字符串Top

19 楼DiabloWalkOnTheEarth(我想到个绝妙的昵称,只是地方太小,写不下)回复于 2004-09-02 08:49:09 得分 0

到数据算法版去搜,怎么每个月都有人问这个问题Top

20 楼longguolin(沧海桑人)回复于 2004-09-02 09:10:36 得分 0

#include   <iostream.h>  
  #include   <conio.h>  
   
  int   fact(int   n);  
   
  main()  
  {  
      int   m;  
      cout<<"Please   input   a   number:";  
      cin>>m;  
      cout<<fact(m);  
      getch();  
      return   0;  
  }  
   
  int   fact(int   n)  
  {  
      if   (n   <=1)  
          return   1;  
      else  
      {  
          return   n*fact(n-1);  
      }  
  }Top

21 楼rockcmc2000(很多东西不是能有你决定的,如果不能反抗,就享受吧!)回复于 2004-09-02 09:40:45 得分 0

我估计是楼主的作业。想他人帮你做而已Top

22 楼fycom200(恋上C++)回复于 2004-09-02 21:51:52 得分 0

错错错……误的理解,实话告诉大家,我是流水线上的工人,不存在作业什么的,编程是我的爱好Top

23 楼fycom200(恋上C++)回复于 2004-09-02 22:05:19 得分 0

TO   qwerty2004(_sky)   :  
  不是我斤斤计较,我是有苦难言,之前我提了一个简单的问题,在未结贴的情况下被作倒分处理了,我怕呀,到http://community.csdn.net/Expert/topic/3319/3319134.xml?temp=.5649988   支持支持我呀Top

24 楼fycom200(恋上C++)回复于 2004-09-02 22:35:13 得分 0

对了,怎么查表,结果都没计算出来到哪里去查?Top

25 楼wuyupu(wuyupu)回复于 2004-09-02 23:53:08 得分 0

#   include   <stdio.h>  
  main()  
  {     int   sum,n,i;  
        sum=1;  
        for(i=1;i<=n;i++)  
            sum=sum*i;  
  printf("%d\n",sum);  
  }  
   
   
  这个差不多吧。Top

26 楼liujingfu123(Oh_My_GoD)回复于 2004-09-03 09:51:01 得分 3

http://community.csdn.net/Expert/topic/3197/3197510.xml?temp=6.156558E-02  
   
  这里有你要的代码!Top

27 楼fycom200(恋上C++)回复于 2004-09-03 22:11:15 得分 0

多谢各位,代码我看到了,正在学习Top

28 楼fatcat2002((我要减肥)肥猫)回复于 2004-09-07 23:08:38 得分 0

int   f(int   m)  
  {static   long   int   f=1;  
    f=f*m;  
    return(f);  
  }  
  main()  
  {int   i,n;  
    scanf("%d",&n);  
    for(i=1;i<=n;i++)  
    printf("%d!=%d\n",i,f(i));  
  }Top

29 楼herryhuang(Herry)回复于 2004-09-07 23:29:50 得分 0

大数计算阿,标准算法,很多的。随便搜搜看Top

30 楼beiji20081(飞鸟)回复于 2004-09-07 23:46:47 得分 0

#define   N   1000  
  main()  
  {...  
  int   s=1;  
  for(i=1;i<=N;i++)  
  s*=i;  
  ....  
  }Top

31 楼telescopewyj(telescope)回复于 2004-09-08 10:38:23 得分 0

这么大的数用long   long   long都不可能存的下吧~~~:P  
  自己写高精度的大数乘法把~~Top

32 楼hongfeeling(无烟亦如烟)回复于 2004-09-10 08:55:10 得分 13

下面的是我写的计算N!的程序,用的算法是最直接的,效率不好,请高手多加指教。  
  在DEV-C++4.9.8.10中调试通过。测试了从3!~8!,结果正确,对于更大的阶乘未经测试  
   
  #include   <stdio.h>  
  #define   MAXLEN       4         //最大长度等于       2的(A-1)   *   MAXLEN次      
                                              //其中A   为arraynode   结构体中长度字段len的数据类型所占字节数  
   
   
  typedef   int   len_type;//arraynode   结构体中长度字段len的数据类型    
  typedef   int   item_type;//原数据的类型,在     void   n_to_a   中使用    
  int   maxlen   =1;  
  typedef   struct  
  {  
        len_type   len;     //数组长度  
        int   *   array;             //元素数组指针  
        int     flag; //0为正数,1为负数  
  }arraynode;  
   
   
  void   n_to_a(item_type   n,arraynode   *);//   从原数据类型到数组  
  void   arrayadd(arraynode   *   arr1,arraynode   *   arr2);//正整数相加arr1+arr2->arr1;  
  void   arraymul(arraynode   *   arr1,arraynode   *   arr2);       //正整数相减arr1*arr2->arr1        
  void   print_largeint(arraynode   *   arr1);    
  void   regular(arraynode   *   arr);                                            
  void   delete_array(arraynode   *   arr);  
  arraynode   *   init(void);  
   
  main()  
  {  
  //int   maxlen   =1;  
  int   n,i;  
  scanf("%d",&n);  
  maxlen   =   maxlen<<((sizeof(len_type)-1)*4);//存放的数据元素个数为maxlen  
  arraynode   *   arr1   =   init();//存放被乘数    
  arraynode   *   arr2   =   init();//存放乘数    
  arr1   ->   len   =1;  
  arr1   ->   array[0]=1;  
  for(i=1;i<=n;i++)  
  {  
           
          n_to_a(i,arr2);  
          print_largeint(arr2);  
          arraymul(arr1,arr2);  
          print_largeint(arr1);  
          delete_array(arr2);  
          arr2   =   init();  
          }//end   for  
         
  print_largeint(arr1);  
  fflush(stdin);  
  getchar();  
  }//end   main  
  void   arraymul(arraynode   *   arr1,arraynode   *   arr2)         //arr1*arr2->arr1    
  {  
          int   i   ,j;  
          arraynode   *   arr3   =   init();  
          arraynode   *   arr4   =   init();  
          for   (i=0;i<arr2->len;i++)//乘数个数    
          {  
                  for(j=0;j<arr1->len;j++)//被乘数个数  
                  {  
                                  arr3->array[i+j]=arr2->array[i]*arr1->array[j];//根据被乘数移位    
                          }   //end   for   int   j  
                          arr3->len   =   i+j;  
                          regular(arr3);  
                          arrayadd(arr4,arr3);  
                          delete_array(arr3);  
                          arr3   =   init();  
                  }//end   for   i=0  
                  arr1->len   =   arr4->len;  
                  for(   i=0;i<arr1->len;i++)  
                                  arr1->array[i]   =   arr4->array[i];  
                  delete_array(arr4);  
  }    
   
  void   n_to_a(item_type   n,arraynode   *arr)  
  {  
          item_type   div=10;         //存放除数    
          int   yushu;                   //存放余数    
          if(n<0){n=-n;arr->flag=1;}//如果为负数,置标志位,将其转化为正数处理    
          for(;n!=0;)  
          {  
                  yushu   =   n%10;  
                  n/=div;  
                  arr->array[arr->len]=yushu;//将余数赋值给第len个元素  
                  arr->len++;    
                  }  
          }//end   function   n_to_a  
           
  void   print_largeint(arraynode   *arr)  
  {  
          int   i   =0;  
          for(i=arr->len-1;i>=0;i--)  
          {  
                  printf("%d",arr->array[i]);  
                  }  
                  printf("\n");  
          }  
   
  void   arrayadd(arraynode   *   arr1,arraynode   *   arr2)//数组相加arr1+arr2->arr1  
  {  
          int   i;  
          for(i=0;i<arr1->len||i<arr2->len;i++)  
                    arr1->array[i]+=arr2->array[i];  
          arr1->len   =   arr1->len>arr2->len?arr1->len:arr2->len;  
          regular(arr1);  
           
  }  
   
   
  arraynode   *   init()  
  {  
      arraynode   *   arr   =   (arraynode   *)malloc(sizeof(arraynode));        
      arr   ->   len       =   0;  
      arr   ->   array   =   (int   *)malloc(maxlen);  
      memset(arr->array,0,maxlen);  
      arr   ->   flag     =   0;  
      return   arr;      
  }  
   
  void   delete_array(arraynode   *   arr)  
  {  
    free(arr->array);          
    free(arr);  
  }  
   
  void   regular(arraynode   *   arr)  
  {  
        int   i;  
        for(i=0;i<arr->len;i++)  
      {  
              arr->array[i+1]   +=   arr->array[i]/10;  
              arr->array[i]%=10;  
              }      
          if(arr->array[i]!=0)arr->len++;      
  }  
  Top

33 楼hongfeeling(无烟亦如烟)回复于 2004-09-10 09:52:57 得分 0

稍微给了一下  
   
  #include   <stdio.h>  
  #define   MAXLEN       4         //最大长度等于       2的(A-1)   *   MAXLEN次      
                                              //其中A   为arraynode   结构体中长度字段len的数据类型所占字节数  
   
   
  typedef   int   len_type;//arraynode   结构体中长度字段len的数据类型    
  typedef   int   item_type;//原数据的类型,在     void   n_to_a   中使用    
  int   maxlen   =1;  
  typedef   struct  
  {  
        len_type   len;     //数组长度  
        int   *   array;             //元素数组指针  
        int     flag; //0为正数,1为负数  
  }arraynode;  
   
   
  void   n_to_a(item_type   n,arraynode   *);//   从原数据类型到数组  
  void   arrayadd(arraynode   *   arr1,arraynode   *   arr2);//正整数相加arr1+arr2->arr1;  
  void   arraymul(arraynode   *   arr1,arraynode   *   arr2);//正整数相减arr1*arr2->arr1        
  void   print_largeint(arraynode   *   arr1);//打印大整数  
  void   regular(arraynode   *   arr);             //归整大整数    
  void   delete_array(arraynode   *   arr);//删除大整数结点  
  arraynode   *   init(void);       //创建大整数结点  
   
  main()  
  {  
  //int   maxlen   =1;  
  int   n,i;  
  scanf("%d",&n);  
  maxlen   =   maxlen<<((sizeof(len_type)-1)*4);//存放的数据元素个数为maxlen  
  arraynode   *   arr1   =   init();//存放被乘数    
  arraynode   *   arr2   =   init();//存放乘数    
  arr1   ->   len   =1;  
  arr1   ->   array[0]=1;  
  for(i=1;i<=n;i++)  
  {  
           
          n_to_a(i,arr2);  
        //   print_largeint(arr2);  
          arraymul(arr1,arr2);  
          //print_largeint(arr1);  
          delete_array(arr2);  
          arr2   =   init();  
          }//end   for  
    printf("%d!=",n);      
  print_largeint(arr1);  
  fflush(stdin);//清空缓冲  
  getchar();         //使程序停止,可以查看结果  
  }//end   main  
  void   arraymul(arraynode   *   arr1,arraynode   *   arr2)         //arr1*arr2->arr1    
  {  
          int   i   ,j;  
          arraynode   *   arr3   =   init();  
          arraynode   *   arr4   =   init();  
          for   (i=0;i<arr2->len;i++)//乘数个数    
          {  
                  for(j=0;j<arr1->len;j++)//被乘数个数  
                  {  
                                  arr3->array[i+j]=arr2->array[i]*arr1->array[j];//根据被乘数移位    
                          }   //end   for   int   j  
                          arr3->len   =   i+j;  
                          regular(arr3);  
                          arrayadd(arr4,arr3);  
                          delete_array(arr3);  
                          arr3   =   init();  
                  }//end   for   i=0  
                  arr1->len   =   arr4->len;  
                  for(   i=0;i<arr1->len;i++)  
                                  arr1->array[i]   =   arr4->array[i];  
                  delete_array(arr4);  
  }    
   
  void   n_to_a(item_type   n,arraynode   *arr)  
  {  
          item_type   div=10;         //存放除数    
          int   yushu;                   //存放余数    
          if(n<0){n=-n;arr->flag=1;}//如果为负数,置标志位,将其转化为正数处理    
          for(;n!=0;)  
          {  
                  yushu   =   n%10;  
                  n/=div;  
                  arr->array[arr->len]=yushu;//将余数赋值给第len个元素  
                  arr->len++;    
                  }  
          }//end   function   n_to_a  
           
  void   print_largeint(arraynode   *arr)  
  {  
          int   i   =0;  
          for(i=arr->len-1;i>=0;i--)  
          {  
                  printf("%d",arr->array[i]);  
                  }  
                  printf("\n");  
          }  
   
  void   arrayadd(arraynode   *   arr1,arraynode   *   arr2)//数组相加arr1+arr2->arr1  
  {  
          int   i;  
          for(i=0;i<arr1->len||i<arr2->len;i++)  
                    arr1->array[i]+=arr2->array[i];  
          arr1->len   =   arr1->len>arr2->len?arr1->len:arr2->len;  
          regular(arr1);  
           
  }  
   
   
  arraynode   *   init()  
  {  
      arraynode   *   arr   =   (arraynode   *)malloc(sizeof(arraynode));        
      arr   ->   len       =   0;  
      arr   ->   array   =   (int   *)malloc(maxlen);  
      memset(arr->array,0,maxlen);  
      arr   ->   flag     =   0;  
      return   arr;      
  }  
   
  void   delete_array(arraynode   *   arr)  
  {  
    free(arr->array);          
    free(arr);  
  }  
   
  void   regular(arraynode   *   arr)  
  {  
        int   i;  
        for(i=0;i<arr->len;i++)  
      {  
              arr->array[i+1]   +=   arr->array[i]/10;  
              arr->array[i]%=10;  
              }      
          if(arr->array[i]!=0)arr->len++;      
  }  
  Top

34 楼hongfeeling(无烟亦如烟)回复于 2004-09-15 14:23:18 得分 0

楼主给分了,我这个不好。  
      最近看了   一个算法它的效率比较高,我改进以后,在毒龙750上一万的阶乘只要6秒不到。  
  我这个程序却要120秒。Top

35 楼fycom200(恋上C++)回复于 2004-09-16 18:58:16 得分 0

问题解决了当然要给分了Top

相关问题

  • 程序人生(斑竹保留)
  • 程序人生(斑竹保留)
  • 程序人生(斑竹保留)
  • 请斑竹和各位仁兄、仁弟看看这个程序
  • Delphi程序员 星座大调查(斑竹请保留 谢了)
  • 斑竹,不要删啊。谢了。急聘 VC++/C++程序员
  • Unix论坛(斑竹都是写有经验的程序员)
  • goodboy1881申请C/C++ 工具平台和程序库斑竹
  • 支持不死鸟做斑竹!!!
  • 有感于“致斑竹的一封公开信”   致所有的程序员

关键词

  • 字段
  • 数据
  • 结构
  • arraynode
  • arr
  • len
  • maxlen
  • arrayadd
  • 数组
  • 整数

得分解答快速导航

  • 帖主:fycom200
  • qwerty2004
  • fanbest
  • liujingfu123
  • hongfeeling

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo