精度计算-大数阶乘

精度计算-大数阶乘

本算法的目的在于计算一个比较大的数的阶乘,由于得到的结果比较大,是现有的数据类型无法存储的,所以我决定将结果存储在一个long a[]数组中。

我们的思路是把每4位数看做数组的一个元素来存储,例如:个、十、百、千存在a[0],万、十万、百万、千万存在a[1]以此类推。

我们用10的阶乘来模拟一下求结果大于4位数阶乘的过程,9的阶乘为362880,而10的阶乘为9的阶乘乘以10,在计算完9的阶乘时a[0] = 2880,a[1]=36,因为362880*10 = (36*10+2880*10/10000)*10000+28800%10000 = 3628800。同理其他高阶的数的计算过程和这个大同小异了

下面是我的C语言实现过程:

int factorial(int n)
{
	long a[10000];
	int i,j,c,m=0;
	a[0]=1;
	for(i=1;i<=n;i++)
	{
		c=0;
		for(j=0;j<=m;j++)
		{
			a[j]=a[j]*i+c;
			c=a[j]/10000;
			a[j]=a[j]%10000;
		}
		printf("\n");
		if(c>0)
		{
			m++;
			a[m]=c;
		}
	}
	printf("\n%ld",a[m]);
	for(i=m-1;i>=0;i--)
		printf("%4.4ld",a[i]);
return w;
} 
时间: 2024-10-28 10:02:46

精度计算-大数阶乘的相关文章

斯特林公式(计算大数阶乘)

#include <iostream> #include <cstdio> #include <cmath> #define PI 3.1415926535898 #define e 2.718281828459 using namespace std; ///斯特林 ///n!=sqrt(2*PI*n)*pow(n/e,n) int main() { int n;cin>>n; while(n--){ long long m; scanf("%l

精度计算-大数乘大数

精度计算                     大数乘大数 本算法是用来计算一个大数(现有的数据类型无法表示的数)乘以一个大数(现有的数据类型无法表示的数). 算法思路是把大数的每一位都当做一个字符放入一个字符数组中,再把乘数的各个位与被乘数的各个位从最高位依次相乘,将结果存放在一个二维数组res中.例如计算12*12,res[0][0] = 1,res[0][1] = 2,res[1][0] = 2,res[1][1] = 4,那么最终结果的数组s,s[0] = res[0][0]= 1,s

精度计算-大数加大数

精度计算                大数加大数 本算法是用来计算一个大数(现有的数据类型无法表示的数)加上一个大数(现有的数据类型无法表示的数). 算法思路是把作为被加数和加数的大数的每一位都当做一个字符分别放入一个字符数组中,再把加数的各个位与被加数的各个位从最低位依次相加,将结果存放在一个字符指针中,最后再放入一个结果数组中. 下面是我的C语言实现过程 #include<stdio.h> #include<string.h> void add(char a[],char b

精度计算-大数乘小数

精度计算-大数乘小数 本算法是用来计算一个大数(现有的数据类型无法表示的数)乘以一个小数(10以内的数). 算法思路是把大数的每一位都当做一个字符放入一个字符数组中,再从最后一位开始于要乘的小数相乘并加上前一位的进位,如果有进位存入一个变量中,加到下一位的计算中去. 下面是我的C语言实现过程. int main() { char c[100] = "1231231231231231231231231231231232"; char t[101] ; int m = 10; mult(c

NYON28大数阶乘

大数阶乘 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它? 输入 输入一个整数m(0<m<=5000) 输出 输出m的阶乘,并在输出结束之后输入一个换行符 样例输入 50 样例输出 30414093201713378043612608166064768844377641568960512000000000000 解析:在开数组的时候一定要开大一点,我开的小怎么都不能通过,气死我了,

nyoj___大数阶乘

http://acm.nyist.net/JudgeOnline/problem.php?pid=28 大数阶乘 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它? 输入 输入一个整数m(0<m<=5000) 输出 输出m的阶乘,并在输出结束之后输入一个换行符 样例输入 50 样例输出 3041409320171337804361260816606476884437764156896

#转 大数阶乘算法

大数阶乘算法 大数阶乘算法 前几天朋友问我一个问题:“10000的阶乘怎么算?”当时我就有点懵,“10000”这个数字太大了,无论用什么数据类型保存结果都会溢出.这可怎么办呢?一时间束手无策.然后被一顿鄙视.后来经朋友的提醒,才恍然大悟,终于知道怎么实现了,原来是使用数组来模拟数字,这样无论结果数字有多大,只要数组的长度够长就能表示出来,用这个办法可以进行大数据的运算.看起来还是挺有用的.我把它用程序实现出来,如果有用到的地方还可以借鉴一下.(最起码还可以拿来鄙视别人^_^)首先定义一个足够长的

【大数阶乘】NYOJ-28

大数阶乘 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它? 输入 输入一个整数m(0<m<=5000) 输出 输出m的阶乘,并在输出结束之后输入一个换行符 样例输入 50 样例输出 30414093201713378043612608166064768844377641568960512000000000000 [代码] 1 //NYOJ-28 大数阶乘 2 //直接开足够大的数组

多精度计算备忘录之乘法 ------ 复杂度分析

多精度计算里,多精度乘法是其中最重要的运算之一,编写的多精度库(类)的其中一个重要效率标识就是其乘法的速度. 根据曾经写的大数类的记忆,简单记录下其中的一些技巧,以备查询. 一般的算法有如: 多精度乘法,所知的几个主要的优化方法有: 1:直接乘法. 2:comba乘法 3:Karatsuba乘法 4:toom_cook乘法 5:FFT乘法 6:FNT算法,或其他类似的有限域上对应类似的FFT算法 7:自己未曾理解的算法. 8:改进技巧, 1:直接乘法. a   b    c *