用高精度方法计算n! ,并显示n!(阶乘)的值。
生活随笔
收集整理的這篇文章主要介紹了
用高精度方法计算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; }方法二:
?
總結
以上是生活随笔為你收集整理的用高精度方法计算n! ,并显示n!(阶乘)的值。的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: char str[] 和 char *s
- 下一篇: 任意长度的高精度大整数加法