`
isiqi
  • 浏览: 16005371 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

用高精度方法计算n! ,并显示n!(阶乘)的值。

 
阅读更多

【问题描述】
对于任意给定的n值(n为整数,且1<=n<=100),计算并显示n!(阶乘)的值。
【样例】
输入:n= 10
输出: 3628800
又输入:n= 20
输出: 2432902008176640000

使用整型数组来存储大数类的每一位,并模拟手工乘法的全过程。。

#include "stdio.h"
#include "stdlib.h"

const unsigned int MAX = 10000;            //整型数组的最大长度 
const long long WIDTHMAX = 1000000000;     //整型数组val[MAX]的元素上限 
const unsigned int WIDTH = 9;              //输出整型数组val[MAX]的元素时的格式宽度,即整型数组val[MAX]的元素的最多位数 

typedef struct node
{
    long long val[MAX];       //用来存储高精度整数 
    unsigned int size;        //整型数组的实际长度 
}BigInt;

void PrintBigInt(const BigInt & a);    //输出大数类
BigInt MulBigInt(const BigInt & a, const BigInt & b);     //大数类相乘
BigInt FacBigInt(unsigned int n);           //大数类求阶乘


void PrintBigInt(const BigInt & a)
{
	unsigned w;
	int i;
	printf("%lld",a.val[a.size-1]);
    for (i=a.size-2; i>=0; i--)
    {
		w = WIDTHMAX / 10;
        while (w > 0)
        {
            if (a.val[i] >= w)
                break;
			printf("0");
            w /= 10;
        }
		printf("%lld",a.val[i]);
    }
	printf("\n");
}

/*
函数名称:MulBigInt
函数功能:高精度整数乘法
输入参数:const BigInt & a:用整型数组表示的高精度整数被乘数 
          const BigInt & b:用整型数组表示的高精度整数乘数 
输出参数:BigInt:返回用整型数组表示的高精度整数乘积 
*/
BigInt MulBigInt(const BigInt & a, const BigInt & b)
{
	int i,j;
	BigInt c;
	if (a.size == 1 && a.val[0] == 0)
		return a;
	if (b.size == 1 && b.val[0] == 0)
		return b;

	for (i=0; i<MAX; i++)    //全部赋初值为0 
		c.val[i] = 0;
	for ( i=0, j=0; i<b.size; i++)
	{
		for (j=0; j<a.size; j++)
		{
			c.val[i+j] += a.val[j] * b.val[i]; 
			c.val[i+j+1] += c.val[i+j] / WIDTHMAX; 
			c.val[i+j] %= WIDTHMAX; 
		}
		c.size = i + j;
		if (c.val[c.size] != 0)    //最高位有进位 
			c.size++;
	}
	return c;
}


/*
函数名称:FacBigInt
函数功能:高精度整数阶乘
输入参数:unsigned int n:正整数 
输出参数:BigInt:返回用整型数组表示的高精度整数阶乘 
*/
BigInt FacBigInt(unsigned int n)
{
	unsigned long long i;
    BigInt s, c;
    c.size = s.size = 1;
    s.val[0] = 1;
    for (i=2; i<=n; i++)
    {
        c.val[0] = i;
        s = MulBigInt(s, c);
    }
    return s;
}

int main(void)
{
	BigInt a;
	unsigned int n;
	printf("请输入n值:");
	scanf("%u",&n);
	a=FacBigInt(n);
	printf("%u的阶乘为:\n",n);
	PrintBigInt(a);
	system("pause");
	return 0;    
}


分享到:
评论

相关推荐

    C语言高精度计算N的阶乘代码

    精确计算N的阶乘。其中,N可能是小于200的任意正整数。 【输入形式】 输入文件为当前目录下的factor.in。该文件只包含一个正整数,表示需要求该正整数的阶乘。 【输出形式】 输入文件为当前目录下...

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

    用Stirling逼近近似计算阶乘n!,老师提供的高精度计算的参考资料

    高精度计算1000阶乘

    高精度计算1000阶乘,详细输出!#include using namespace std; #include const int N = 100000; int a[N];

    用高精度算N阶乘,编程语言c++,acm经典题型之一...

    ~~~~用高精度算N阶乘,编程语言c++,acm经典题型之一...

    【JAVA】(vip)蓝桥杯试题 基础练习 阶乘计算 BASIC-30 JAVA

    可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。  将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意...

    HugeCalc V6.1.0.1

    为了与广大网友分享 HugeCalc 带来的便捷,该版公开了 HugeCalc.dll 的所有接口文件(同时支持 MBCS + UNICODE 版),大家可以更自由地进行高精度计算或自开发,而无须再依赖于 Mathematica 等大型软件。...

    c语言阶乘之和问题示例详解

    用高精度计算出S=1!+2!+3!+…+n!(n≤50) 其中“!”表示阶乘,例如:5!=5*4*3*2*1。 输入输出格式 输入格式: 一个正整数N。 输出格式: 一个正整数S,表示计算结果。 输入输出样例 输入样例 3 输出样例 9...

    超级计算器

    这是一个精度极高、运算速度极快的计算器软件。可将四则运算计算到5万位以上,指数、对数、三角函数计算到300位以上,计算速度比同类产品最快者运算速度快10-300倍。 它不但可以精确数进行计算,也可以对近似数进行...

    Excel公式与函数大辞典.宋翔(带书签高清文字版).pdf

    本书从函数功能、函数格式、参数说明、注意事项、Excel 版本提醒、案例应用、交叉参考7 个方面,全面、细致地介绍了Excel 2016/2013/2010/2007/2003 中公式和函数的使用方法、实际应用和操作技巧。最后3 章还将公式...

    浙江大学ACM模板 计算几何,图论,数据结构,经典题的模板

    3.6.2 高精度乘幂 117 3.7 高斯消元回代法 122 3.8 数值计算 124 3.8.1 定积分计算 124 3.8.2 多项式求根(牛顿法) 125 3.8.3 周期性方程(追赶法) 127 4.排序 128 4.1快速选择算法 128 4.2归并排序+逆序数的求取 128 ...

    (正态)相关勒让德多项式的一阶导数:(归一化)相关勒让德多项式的一阶导数-matlab开发

    计算相关勒让德多项式的精确导数可能很棘手。 即使在高级文本中,它们通常也被写成递归关系和/或包含阶乘的(归一... 它的工作原理与 MATLAB 自己的 LEGENDRE 相同,不同之处在于它不计算多项式值,而是计算导数的值。

    勒让德多项式:相关勒让德多项式的快速计算-matlab开发

    系数是从较早的系数递归计算的(以避免计算多个阶乘)。 对于数据数组 x 的任何结构,多项式是使用精确的 l/2 乘法和加法计算的。 多项式系数对于中度/高度可能非常大,从而导致精度降低。 对于这些情况,最好使用...

    〖程序设计基础〗练习题3及答案

    用三目条件运算符,求变量 x 、y的最大值和最小值,并分别赋给变量 max 和min, 这两个赋值语句分别是 _________和________。 3.结构化程序设计的三种基本流程控制结构是:_____________、 _____________、__________...

    ACM 算法经典代码 数据结构经典代码

    1.精度计算——大数阶乘 2.精度计算——乘法(大数乘小数) 3.精度计算——乘法(大数乘大数) 4.精度计算——加法 5.精度计算——减法 6.任意进制转换 7.最大公约数、最小公倍数 8.组合序列 9.快速傅立叶变换...

Global site tag (gtag.js) - Google Analytics