百科问答小站 logo
百科问答小站 font logo



怎么样用c语言求1000的阶乘? 第1页

  

user avatar   wei-xing-93-85 网友的相关建议: 
      

C/C++写高精度计算建议直接用现成的库。

比如GNU MP,完全开源,编译安装过程官网也写的很明白。

代码这么写(C语言版本):

       #include <stdio.h> #include <gmp.h> int main() {  mpz_t result;  mpz_init_set_ui(result, 1);  for (int i = 1; i <= 1000; i++)  {   mpz_mul_ui(result, result, i);  }  gmp_printf("%Zd
", result);  mpz_clear(result);  return 0; }     


这段代码在我这里只需要0.057毫秒。根据您的水平不同,使用现成的库的性能很可能比您手写的算法高2000倍到2倍不等。并且能帮您节省数十分钟到数十小时的开发调试优化时间。

您刚入门C语言,如果您的志向不在算法研究之类的数学专业上,自己造个大数类的轮子什么的基本完全没意义,现成的开源库性能好不知道多少倍为啥不用呢?

哦对了,这种东西不建议百度算法,百度上你看到的大概率是慢200倍+的。


user avatar   cong-ge-lai-ye 网友的相关建议: 
      

这个我也想过,想不出来,于是到网上找了找大佬们的解答,找到一个比较容易接受的算法。

我们小时候要算两个数的积时,应该都会列竖式算的吧?(大佬请忽略)这个算法的原理就是用数组去表示积的每一位数,用一个变量表示进位,比如72要用两个元素的数组表示,784要用三个元素的数组表示。

不多赘述了,直接看代码。

       //函数功能:打印非负整数的阶乘值  void Print_Factorial ( const int N ){  int num = 0;      int a[20000] = {1};    //令数组第一个元素为1    int max = 1;     //当前结果的最大位数   int temp;  if(N < 0)  {   printf("Invalid input");  //负数直接返回    return;  }  else{    for(int i = 2; i <= N; i++)   //外层循环控制阶乘阶数    {    num = 0;    for(int j = 0; j < max; j++)      {     temp = a[j] * i + num;      a[j] = temp % 10;  //计算结果结果个位,十位,百位...上的数      num = temp / 10;  //num如果非零的话会累计到下一位     }        while(num)    //判断num是否非零,决定是否要增加位数max     {     a[max] = num % 10;        num = num / 10;     max++;    }   }   for(int i = max - 1; i >= 0; i--)  //逆序输出数组元素    {    printf("%d", a[i]);   }   }  return; }     

再解释一下,如果N小于2的话,不会进入循环,直接输出1。而N大于2时,第一次循环时,a[0] = 2,第二次循环a[0] = 6,第三次a[0] = 24,超过10了,需要进位,那么此时a[0]等于24的个位数即4,而十位数2被num保留,因此进入while循环,给位数max加1,代表当前有了两位数......如此往复,理论上只要给扩大数组,有足够时间和内存,就可以算任何数的阶乘了,1000当然不在话下。

结果如下


user avatar   zhang-hao-72 网友的相关建议: 
      

没说要求精确值吧?用long double类型,斯特林公式就行了吧……


user avatar   yi-li-ya-ai-yin-zi-bei-lun 网友的相关建议: 
      

我支持。因为匿名是网络环境差的万恶之源。


知乎做得好。与此同时,头条和抖音也上线了IP属地。


根据 @新浪财经 报道:

据悉,今日头条、抖音展示的帐号IP属地均为用户最近一个月内最后一次发文或评论时的网络位置,境内展示到省(直辖市、自治区、特别行政区),境外展示到国家(地区)。而且帐号IP属地以运营商提供信息为准,相关展示不支持手动开启或关闭。

在公告中,今日头条和抖音均提出,展示账号IP属地是为了维护真实有序的讨论氛围,减少冒充热点事件当事人、恶意造谣、蹭流量等不良行为。快手则表示是为了防止部分网友在热点事件中出现蹭流量、传播不实信息、冒充当事人等干扰正常讨论的行为。

实际上,在字节跳动和快手的产品上线该功能之前,微博已经于今年3月先行一步。3月17日,微博官方账号称,因发现个别冒充当地网友发布和传播不实信息的行为,微博将上线“用户个人资料页展示近期发帖所在地”的功能。

据悉,微博也是在个人主页中展示用户最近一个月内最后一次发布微博或评论的IP归属地,而且IP归属地显示规则与评论区此前显示规则保持一致,国内显示到省份/地区,国外显示到国家。


2、

几乎所有的网红产品,都是利用人性的七宗罪所达到的。


而匿名就是网络环境的万恶之源。


匿名,意味着一个人不需要对自己的言行负责,无论你是咒骂那个普通人去死,还是问候他的十八代祖宗。


在网络平台上,我们看过了太多这种悲剧。


为什么女权的“权”会被污名化成“拳头”的拳?


我个人是支持女权的。但是里面有人在故意把水搅浑。


为什么有人被人肉和网暴?


因为在屏幕面前可怕的那个他,不需要承担任何责任。甚至很多明星粉丝对普通人群起而攻之,所倚仗的,不过如此。


为什么微信上的环境要比微博等好得多?


因为微信是实名化的。喷他,意味着他可能能找到你的真实身份,如果他想的话。


当然,做人是需要互联网树洞的。在BBS这种场景下,所有人都可以匿名化。

而在如微博等社交平台上,我支持全面实名化。


但愿天下不再有网络暴力。




  

相关话题

  请问如何区分c语言中float和double的用法? 
  如何通俗地解释 C、C++、C#、Java、JavaScript、HTML、Python的用处? 
  网上有对于C++编程要避免使用cin、cout、fstream;而是使用scanf、printf、FILE *的说法, 请问是正确的吗? 
  %d的d代表什么? 
  C语言编译器是如何实现指针+1这样的一个机制? 
  C语言中整型输出(%d)有什么用? 
  为什么现在国内各大高校仍选用谭浩强的《C 程序设计》为教材? 
  为什么学习编程第一课要学习输出"hello, world"?这是谁规定的? 
  有没有什么程序库使得我们可以比较方便的在windows下使用比较新版本的opengl的? 
  C语言能用指针修改其他程序的地址的值吗? 

前一个讨论
金庸为什么要频繁修改自己的小说?
下一个讨论
C++ 11为什么引入nullptr?





© 2024-06-23 - tinynew.org. All Rights Reserved.
© 2024-06-23 - tinynew.org. 保留所有权利