用高精度方法计算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] = 0for ( 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;    }

方法二:
 

#include<iostream>using namespace std;#define MAX 1000 int main(void){    int n;    while(scanf("%d",&n) == 1 && n >= 0)    {        int i,j;        int a[MAX];      //存数运算结果        int p , add;           //p存储当前结果的位数,add为进位        a[1] = 1;        p = 1;         for(i = 2 ; i <= n ; ++i)   //循环与2,3,4.....n相乘        {            for(j = 1 , add = 0 ; j <= p ; ++j)    //让a[]的每位与i相乘            {                a[j] = a[j] * i + add;                add = a[j] / 10;                a[j] = a[j] % 10;            }            while(add > 0)         //如果h不为0            {                a[j] = add % 10;                add = add / 10;                ++j;            }            p = j - 1;            //将当前的位数赋给p        }        for(i = p ; i >= 2 ; --i)    //a[]数组的前面是低位,后面高位        {            printf("%d",a[i]);        }        printf("%d\n",a[i]);    }    return 0;}

           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

猜你喜欢

转载自blog.csdn.net/fguihbfg/article/details/86583737