【问题描述】
对于任意给定的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;
}
分享到:
相关推荐
精确计算N的阶乘。其中,N可能是小于200的任意正整数。 【输入形式】 输入文件为当前目录下的factor.in。该文件只包含一个正整数,表示需要求该正整数的阶乘。 【输出形式】 输入文件为当前目录下...
用Stirling逼近近似计算阶乘n!,老师提供的高精度计算的参考资料
高精度计算1000阶乘,详细输出!#include using namespace std; #include const int N = 100000; int a[N];
~~~~用高精度算N阶乘,编程语言c++,acm经典题型之一...
可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。 将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意...
为了与广大网友分享 HugeCalc 带来的便捷,该版公开了 HugeCalc.dll 的所有接口文件(同时支持 MBCS + UNICODE 版),大家可以更自由地进行高精度计算或自开发,而无须再依赖于 Mathematica 等大型软件。...
用高精度计算出S=1!+2!+3!+…+n!(n≤50) 其中“!”表示阶乘,例如:5!=5*4*3*2*1。 输入输出格式 输入格式: 一个正整数N。 输出格式: 一个正整数S,表示计算结果。 输入输出样例 输入样例 3 输出样例 9...
这是一个精度极高、运算速度极快的计算器软件。可将四则运算计算到5万位以上,指数、对数、三角函数计算到300位以上,计算速度比同类产品最快者运算速度快10-300倍。 它不但可以精确数进行计算,也可以对近似数进行...
本书从函数功能、函数格式、参数说明、注意事项、Excel 版本提醒、案例应用、交叉参考7 个方面,全面、细致地介绍了Excel 2016/2013/2010/2007/2003 中公式和函数的使用方法、实际应用和操作技巧。最后3 章还将公式...
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 自己的 LEGENDRE 相同,不同之处在于它不计算多项式值,而是计算导数的值。
系数是从较早的系数递归计算的(以避免计算多个阶乘)。 对于数据数组 x 的任何结构,多项式是使用精确的 l/2 乘法和加法计算的。 多项式系数对于中度/高度可能非常大,从而导致精度降低。 对于这些情况,最好使用...
用三目条件运算符,求变量 x 、y的最大值和最小值,并分别赋给变量 max 和min, 这两个赋值语句分别是 _________和________。 3.结构化程序设计的三种基本流程控制结构是:_____________、 _____________、__________...
1.精度计算——大数阶乘 2.精度计算——乘法(大数乘小数) 3.精度计算——乘法(大数乘大数) 4.精度计算——加法 5.精度计算——减法 6.任意进制转换 7.最大公约数、最小公倍数 8.组合序列 9.快速傅立叶变换...