`

N!阶乘的高效算法

    博客分类:
  • ACM
阅读更多
阶乘递归代码:(教材)
#include<stdio.h>
int f(int n);
void main()
{
  printf("%d\n",f(5));
}
int f(int n)
{
  if(n==0)return 1;
  return n*f(n-1);
}



============================================================
大数阶乘问题
10000以内的阶乘及位数:
============================================================
代码一:
#include <stdio.h>
int main()
{
    int carry,n,j;
    int a[40001];
    int digit;
    int temp,i;   
    while(scanf("%d",&n)!=EOF){
    a[0]=1;digit=1;
    for(i=2; i<=n; i++)
    {
        for(carry=0,j=1; j<=digit; ++j)
        {
            temp=a[j-1]*i+carry;
            a[j-1]=temp%10;
            carry=temp/10;
        }
        while(carry)
        {
            //digit++;
            a[++digit-1]=carry%10;
            carry/=10;
        }
    }
   
    for(int k=digit; k>=1; --k)
        printf("%d",a[k-1]);
    printf("\n");
 printf("length=%d\n",digit);
 }
    return 0;
}



代码二:
#include <iostream>  
using namespace std; 
void main()  
{  
  int result[40000]; //保存结算结果的数组   
  int height = 1;  //结果的最高位   
  int num;  //计算阶乘的数字   
  cin>>num;   
  result[0] = 1;  
  for (int i=1;i<=num;i++)  
  {  
    int res = 0; //进位   
    for (int j=0;j<height;j++)  
    {  
      int buf = result[j] * i + res; //计算结果   
      result[j] = buf % 10;  //取当前位   
      res = buf / 10;   //计算进位   
    }  
    while (res)  
    {  
      result[height++] = res % 10; //取当前位   
      res /= 10;   //计算进位   
    }    
  }    
  
  for (int k=height-1;k>=0;k--)  
  {  
     cout<<result[k];  
  }  
  cout<<endl;  
  cout<<"length="<<height<<endl;  
} 


============================================================
例如1000阶乘位数:
log10(1)+log10(2)+•••+log10(1000)取整后加1
============================================================
#include<stdio.h>
#include<math.h>
void main()
{
  int n,i;
  double d;
  scanf("%d",&n);
  d=0;
  for(i=1;i<=n;i++)
	  d+=log10(i);
  printf("%d\n",(int)d+1);
}



============================================================
高效算法
斯特林公式(stirling)求阶乘的位数:
============================================================
#include<stdio.h>
#include<math.h>
#define PI 3.1415926
int main()
{
int cases,n,ans;
scanf("%d",&cases);
while(cases--)
{
   scanf("%d",&n);
   if(n==1)
    printf("1\n");
   else
   {
     ans=ceil((n*log(n)-n+log(2*n*PI)/2)/log(10));
      printf("%d\n",ans);
   }
}
return 0;
}


============================================================
阶乘最后非零位:
============================================================
#include<stdio.h> 
#include<string.h> 
#define maxn 10000 
int lastdigit(char buf[]) 
{ 
	const int mod[20]={1,1,2,6,4,2,2,4,2,8,4,4,8,4,6,8,8,6,8,2}; 
	int len=strlen(buf),a[maxn],i,c,ret=1; 
	if(len==1) 
		return mod[buf[0]-'0']; 
	for(i=0;i<len;i++) 
		a[i]=buf[len-1-i]-'0'; 
	for(;len;len-=!a[len-1]) 
	{ 
		ret=ret*mod[a[1]%2*10+a[0]]%5; 
		for(c=0,i=len-1;i>=0;i--) 
			c=c*10+a[i],a[i]=c/5,c%=5; 
	} 
	return ret+ret%2*5; 
} 
int main() 
{ 
	char n[maxn]; 
	int a; 
	while(scanf("%s",n)!=EOF) 
	{ 
		a=lastdigit(n); 
		printf("%d\n",a); 
	} 
	return 0; 
}

分享到:
评论

相关推荐

    C语言实现N的阶乘的算法

    本文将详细讨论如何使用C语言来实现一个计算N的阶乘的算法。 首先,我们需要理解阶乘的基本定义。对于非负整数N,N的阶乘(表示为N!)是所有小于及等于N的正整数的乘积。例如,5的阶乘(5!)就是5 * 4 * 3 * 2 * 1 ...

    C语言n的阶乘n!程序

    在本文中,我们将深入探讨如何使用C语言编写计算阶乘(n!)的程序。阶乘是一个数学概念,表示从1乘到n的所有自然数的乘积,通常用于组合数学和...通过不断地实践和优化,我们可以编写出更加高效和可靠的阶乘计算程序。

    阶乘算法的简单实现

    阶乘算法是计算机科学中一个基础且重要的概念,主要用于数学计算和组合数学中。阶乘表示的是一个正整数n的所有小于等于n的正整数的乘积,通常表示为n!。例如,5!(5的阶乘)等于5×4×3×2×1,结果是120。 在C#...

    用C++编写的大数阶乘n!

    这涉及到两个大数之间的乘法操作,可以使用Karatsuba算法、Toom-Cook算法或其他更高效的乘法算法。 4. **进位处理**:在大数乘法过程中,需要考虑进位问题,这通常是通过额外的加法操作完成的。 5. **溢出检查**:...

    n的阶乘高效率算法

    在编程领域,阶乘是一个常见的数学概念,通常用于计算组合数和解决递归问题。n的阶乘表示为n!,定义为所有小于等于n且大于等于1的正...提供的压缩包文件“n阶乘”可能包含了实现这些高效算法的源代码,供学习和参考。

    数据结构实习之n(n≥20)的阶乘

    6. **算法优化**:快速幂算法可以用于减少计算阶乘时的乘法次数,将n!表示为2的幂次和奇数的乘积,降低时间复杂度。 7. **错误处理**:处理负数或非整数输入,确保程序的健壮性。 8. **效率比较**:对比不同方法...

    C#,阶乘(Factorials)的递归、非递归、斯特林近似及高效算法与源代码

    C#,阶乘(Factorials)的递归、非递归、斯特林近似及高效算法与源代码 阶乘是基斯顿·卡曼(Christian Kramp,1760~1826)于 1808 年发明的运算符号,是数学术语。 一个正整数的阶乘(factorial)是所有小于及等于...

    阶乘算法 阶乘问题 C# 小程序

    阶乘算法是计算一个正整数n的所有小于等于n的正整数的乘积的数学概念,表示为n!。在计算机科学中,阶乘算法经常用于解决各种问题,如组合数学、排列组合以及概率计算等领域。C#是一种常用的编程语言,它提供了多种...

    N!的求法 大数阶乘 最好的大数阶乘 C++

    ### N!的求法:大数阶乘的最佳C++实现 在计算机科学中,阶乘是一种常见的数学运算,表示为N!(其中N为非负整数),...此外,该方法还可以进一步优化,例如采用更高效的乘法算法或者利用多线程并行计算来提高计算效率。

    用Stirling逼近近似计算阶乘n!

    递归版本的阶乘函数`fac`仅用于演示,实际应用中应当使用循环或者其他优化算法。 为了提高效率,可以使用动态规划或者备忘录技术存储已计算过的阶乘值,避免重复计算。此外,代码中使用了`frac`函数来获取浮点数的...

    C++ 实现大数阶乘的算法

    C++的`list()`模板是一种高效且灵活的数据结构,特别适合处理动态增长的序列,比如在计算大数阶乘时可能会遇到的情况。 首先,我们要理解阶乘的概念。阶乘是一个正整数n的乘积,表示为n!,其中1! = 1,2! = 2 × 1...

    基础算法,递归思想算法,阶乘算法

    本文将深入探讨基础算法、递归思想以及阶乘算法,同时我们还会看到如何使用C语言来实现这些概念。 首先,基础算法是计算机科学的基础,涵盖排序、搜索、图论等多个方面。学习基础算法有助于我们理解如何高效地处理...

    递归算法求阶乘.rar

    在计算机科学中,递归是一种强大的编程技巧,它涉及到函数或过程在其定义中调用自身...通过适当优化,如记忆化和迭代,我们可以实现更高效地计算阶乘。在实际编程中,理解和掌握递归是解决各种复杂问题的关键技能之一。

    【C#】求大数阶乘_算法_C#

    乘法是阶乘的核心,可以使用分治策略的Karatsuba算法或者Toom-Cook算法等高效算法进行优化。 - 阶乘计算:从1乘到n,每次乘法的结果更新到大数类的实例中。 2. 使用第三方库: - BigInteger类:.NET Framework ...

    n的阶乘问题--阶乘位数--阶乘末尾0的个数

    在编程领域,阶乘是一个常见的数学概念,尤其在算法和计算数学中经常被用到。本文将深入探讨“n的阶乘问题”,包括阶乘的定义、计算阶乘位数的方法以及如何确定阶乘末尾零的个数。 首先,阶乘是指一个正整数n与小于...

    利用递归算法求阶乘(VB6.0源代码)利用递归算法求阶乘

    在这个主题中,我们将深入探讨如何使用递归算法在VB6.0(Visual Basic 6.0)中计算阶乘。VB6.0是Microsoft开发的一款经典可视化编程环境,用于创建Windows应用程序。 阶乘是一个数学概念,表示一个正整数n的所有...

    用于求阶乘的c语言程序

    然而,在实际应用中,我们经常需要处理大规模的阶乘运算,这就需要我们开发高效的算法和实现方案。 本文将介绍一个使用C语言实现的阶乘程序,该程序可以处理大规模的阶乘运算,最大结果位数可以达到20000位。该程序...

    c#计算n的阶乘源码

    在编程领域,阶乘是一个非常基础且重要的数学概念,它被广泛应用于计算机科学中的各种算法,如组合数学、概率论以及动态规划等。本篇将深入探讨如何使用C#语言在ASP.NET环境中实现计算任意正整数n的阶乘功能。 首先...

    C语言求大学N的阶乘

    本文档介绍了使用C语言实现大学N的阶乘的代码实现,包括数据结构、动态内存分配和算法实现等方面的知识点。 一、数据结构 在本文档中,我们使用了链表数据结构来存储大学N的阶乘结果。链表节点的定义如下: ```c ...

    用数组求N的阶乘,可以运行

    在编程领域,阶乘是一个常见的数学概念,通常...总的来说,数组求N的阶乘是基础的算法实现,它有助于我们理解递归、循环以及数组在解决问题中的应用。在实际编程中,我们应根据具体需求和资源限制选择合适的计算方法。

Global site tag (gtag.js) - Google Analytics