几种算法-----n的阶乘
2018-01-25 17:43
393 查看
问题描述:
输入一个正整数n,输出n!的值。
其中n!=1*2*3*…*n。
算法 1 —–递归
算法2——循环
算法3——高精度算法
算法3思路:
n!可能很大,算法1和算法2都存在溢出现象,故采用高精度算法:使用一个数组arr来表示一个大整数A,arr[0]表示A的个位,arr[1]表示A的十位,依次类推。
A乘以某一数K转化成A的每一位都乘以k,并且处理相应的位数
由于n的阶乘为1*2*3*………..*n,故数组的第一项应初始化为1,其余初始化为0(如图)
结果:
算法一:
算法二:
算法三:
输入一个正整数n,输出n!的值。
其中n!=1*2*3*…*n。
算法 1 —–递归
long long Factorial(long long n) { if(n==1) 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(如图)
结果:
算法一:
算法二:
算法三:
相关文章推荐
- 阶乘几种算法的比较
- 尾递归、CPS等几种求阶乘的算法
- 假设系统按单值方式运行且采用最短作业优先算法,有J1,J2,J3,J4共4个作业同时到达,则以下哪几种情况下的平均周转时间为10分钟?
- SSE图像算法优化系列十六:经典USM锐化中的分支判断语句SSE实现的几种方法尝试。
- 计算最大公约数的几种算法【网络整理】
- TOP K的几种算法比较
- 几种分页算法。翻页必备
- 几种压缩算法原理介绍
- 二叉树几种遍历算法
- STL学习记录(十四):其它几种算法
- 几种分页算法。翻页必备
- 关于质数的几种算法
- RGB转灰度图的几种算法
- 几种常见的排序算法之比较
- 取自然数中的素数几种算法
- java 几种基础算法的实现 (五)
- C#常用的几种算法
- 七月算法课程《python爬虫》第五课: scrapy spider的几种爬取方式
- 几种编程题高难度常用算法总结
- 几种视频加密算法介绍