问题描述:
算法 1 —–递归
long long Factorial(long long n) { if(n==0) return 1; return Factorial(n-1)*n; } void Test1() { printf("%lld\n",Factorial(1)); printf("%lld\n",Factorial(10)); printf("%lld\n",Factorial(100)); printf("%lld\n",Factorial(1000)); printf("%lld\n",Factorial(10000)); }
讯享网
算法2——循环
讯享网long long Factorial1(long long n) { long long i=1,sum=1; while(i<=n) { sum*=i; ++i; } return sum; } void Test2() { printf("%lld\n",Factorial(1)); printf("%lld\n",Factorial(10)); printf("%lld\n",Factorial(100)); printf("%lld\n",Factorial(1000)); }
算法3——高精度算法
#define MAX 1000 void Mul(int n) { int i=0,j=0; int s;//乘积 int c=0;//进位 //存放大整数a int arr[MAX]={0}; arr[0]=1; for(i=2;i<=n;i++) { for(j=0;j<MAX;j++) { s=arr[j]*i+c; arr[j]=s%10; c=s/10;//进位 } } for(i=MAX-1;i>=0;i--) { //遇到不是0,开始输出 if(arr[i]) break; } for(j=i;j>=0;j--) { //倒序输出 printf("%d",arr[j]); } printf("\n"); } void Test() { Mul(1); Mul(10); Mul(100); }
算法3思路:
n!可能很大,算法1和算法2都存在溢出现象,故采用高精度算法:使用一个数组arr来表示一个大整数A,arr[0]表示A的个位,arr[1]表示A的十位,依次类推。
A乘以某一数K转化成A的每一位都乘以k,并且处理相应的位数
由于n的阶乘为1*2*3*………..*n,故数组的第一项应初始化为1,其余初始化为0(如图)
结果:
算法一:

算法二:

算法三:


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/127870.html