大数的阶乘算法

#include <stdio.h>

#define MAX_LENGTH 20000

// 大数阶乘算法
int main()
{
	int i, j, temp;
	int bitSize = 1;  // 结果的位数
	int result[MAX_LENGTH];
	int n = 0; // 求n的阶乘
	int carryBit = 0;

	scanf("%d", &n);
    result[0] = 1;

	for (i = 2; i <= n; i++)
	{
		carryBit = 0; // 进位位

		// 每次都是将当前结果从低位到高位依次与i相乘
		for (j = 1; j <= bitSize; j++)
		{
			temp = result[j - 1] * i + carryBit;
			result[j - 1] = temp % 10;
			carryBit = temp / 10;
		}

		while (carryBit != 0)
		{
			result[bitSize++] = carryBit % 10;
			carryBit /= 10;
		}
	}

	// 结果是倒序的,所以要倒着输出
	for (i = bitSize - 1; i >= 0; i--)
	{
		printf("%d", result[i]);
	}
	putchar(10);

	return 0;
}
时间: 2024-11-03 01:16:18

大数的阶乘算法的相关文章

阶乘 算法-网上找的c语言的求大数阶乘的答案 看不太懂这个算法 求大神解释算法

问题描述 网上找的c语言的求大数阶乘的答案 看不太懂这个算法 求大神解释算法 #include int main() { ??? int n; ??? int a[9000]; //确保保存最终运算结果的数组足够大 ???? int digit = 1; //位数 ???? int temp;?? //阶乘的任一元素与临时结果的某位的乘积结果 ???? int i, j, carry; //carry:进位 ???? printf("please in put n:n"); ??? s

C++快速幂与大数取模算法示例_C 语言

一.快速幂 其实就是求(a^b)% p ,(其中a,b,p都比较大在int范围内)这类问题. 首先要知道取余的公式: (a*b)%p=(a%p*b%p)%p . 那么幂不就是乘机的累积吗,由此给出代码: int fast(int a,int b,int p) { long long a1=a,t=1; while(b>0) { if(b&1) /如果幂b是奇数多乘一次,因为后边会除2变偶数,(7/2=3) t=(t%p)*(a1%p)%p; a1=(a1%p)*(a1%p)%p; b/=2;

阶乘 算法-求助!求如何秒杀十万的阶乘?

问题描述 求助!求如何秒杀十万的阶乘? 要求是在一秒钟以内计算出十万的阶乘.我试了直接累乘,需要268秒.尝试完全的因式分解,将其分解为一系列素数的次方相乘,在其中第一项为2的99998次方,用二分乘法需要0.2秒,不可能做到一秒内计算出结果.我觉得我是思路问题,求助如何解秒杀十万的阶乘? 解决方案 查表法.将0~10万每1000的阶乘预先算好了记录下来.只需要100个数据,几乎不要什么存储,就可以保证10万以内的阶乘计算都是秒杀.即便计算10万以上,也可以明显提速.这个方法其实用在一些科学计算

深入第K大数问题以及算法概要的详解_C 语言

解法1: 我们可以对这个乱序数组按照从大到小先行排序,然后取出前k大,总的时间复杂度为O(n*logn + k). 解法2: 利用选择排序或交互排序,K次选择后即可得到第k大的数.总的时间复杂度为O(n*k) 解法3: 利用快速排序的思想,从数组S中随机找出一个元素X,把数组分为两部分Sa和Sb.Sa中的元素大于等于X,Sb中元素小于X.这时有两种情况:1. Sa中元素的个数小于k,则Sb中的第k-|Sa|个元素即为第k大数:2. Sa中元素的个数大于等于k,则返回Sa中的第k大数.时间复杂度近

求一简单的阶乘算法C(n,m)

问题描述 就是数学中的C(n,m),n为下标,m为上标.比如C(5,2)=5*4/2*1;又比如C(10,7)=C(10,3)=10*9*8/3*2*1;最好效率高一点,代码要简洁. 问题补充:huozhedecctv 写道 解决方案 天生愚钝,刚写的,看看合理不:public static int c(int a,int b){if(b>a/2){return c(a,a-b);}return up(a,b)/up(b,b);} public static int up(int a,int b

阶乘相关的算法及其C++实现

       有关阶乘的算法,不外乎两个方面:一是高精度计算:二是与数论相关. 一. 高精度计算阶乘 这实际上是最没有技术含量的问题,但是又会经常用到,所以还是得编写,优化它的计算. 首先看小于等于12的阶乘计算(计算结果不会超出32位范围): int factorial(int n) { if (n == 1 || n == 0) return 1; return factorial(n-1)*n; } 这个递归程序简单明了,非常直观,然而一旦n > 12,则超过32位int型的范围出现错误结

UVa 623 500! (高精度阶乘)

623 - 500! Time limit: 3.000 seconds http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=564 In these days you can more and more often happen to see programs which perform some useful

算法系列(十五) 循环和递归在算法中的应用

一.递归和循环的关系 1. 递归的定义 顺序执行.循环和跳转是冯·诺依曼计算机体 系中程序设计语言的三大基本控制结构,这三种控制结构构成了千姿百态的算法,程序,乃至整个软件世 界.递归也算是一种程序控制结构,但是普遍被认为不是基本控制结构,因为递归结构在一般情况下都可 以用精心设计的循环结构替换,因此可以说,递归就是一种特殊的循环结构.因为递归方法会直接或间接 调用自身算法,因此是一种比迭代循环更强大的循环结构. 2. 递归和循环实现的差异 循 环(迭代循环)结构通常用在线性问题的求解,比如多项

JavaScript中数据结构与算法(一):栈

  这篇文章主要介绍了JavaScript中数据结构与算法(一):栈,本文讲解了栈的结构.什么是回文以及递归等内容,讲解的不错,通俗易懂,需要的朋友可以参考下 序 数据结构与算法JavaScript这本书算是讲解得比较浅显的,优点就是用javascript语言把常用的数据结构给描述了下,书中很多例子来源于常见的一些面试题目,算是与时俱进,业余看了下就顺便记录下来吧 git代码下载:https://github.com/JsAaron/data_structure.git 栈结构 特殊的列表,栈内