1. 程式人生 > 其它 >高精度階乘和 高精度演算法

高精度階乘和 高精度演算法

技術標籤:高精度演算法入門c語言c語言

以前刷oj的時候 遇見一個題目 也就是輸入一個數字 判斷階乘和

用高精度計算出S=1!+2!+3!++N!(N≤50),其中"!"表示階乘,
例如:5!=5*4*3*2*1。


輸入正整數N,輸出計算結果S。


輸入
每個測試檔案只包含一組測試資料,每組輸入一個正整數N。


輸出
對於每組輸入資料,輸出階乘和的計算結果。


樣例輸入 Copy
3
樣例輸出 Copy
9

其實看起來還簡單?當然只是對於部分資料如此,比如好像十幾以後的階乘就已經error了,這裡就要用到今天的主角,高精度演算法。
關於高精度的基本加法我寫過 連結在這裡

https://editor.csdn.net/md/?articleId=113096418
因為加法是基礎
所謂高精度的思想是什麼呢?無非就是放入幾個數字 挨個加,看是不是大於10,大的話前一位就+1,當位減去10,依次迴圈就好了;
乘法也是相同的道理:
例如 a=1234 * i=25

s = 4 * 25 + 0 = 100; a[0] = 100%10 = 0; c = 100/10 = 10;
此時a = 1230,c = 10

s = 3 * 25 + 10 = 85; a[0] = 85 %10 = 5; c = 85 /10 = 8;
此時a = 1250,c = 8

s = 2 * 25 + 8 = 58; a[0] = 58 %10 = 8; c = 58 /10 = 5;

此時a = 1850,c = 5

s = 1 * 25 + 5 = 30; a[0] = 30 %10 = 0; c = 85 /10 = 3;
此時a = 0850,c = 3

s = 0 * 25 + 3 = 3; a[0] = 3 %10 = 3; c = 3 /10 = 0;
此時a = 30850,c = 0
關於階乘和可能處理要更多一些
但是基本原理懂,然後注意些細節就可以了
下面上程式碼

#include<stdio.h>
#define N 10000//預定義  如果不定義下面可以用strlen判斷0位 
int main()
{
	int i, j, x, k, n, b[N] = { 0 };
	scanf("%d"
, &n); for (k = 1; k <= n; k++)//階乘的乘數 { int a[N] = { 0 }; a[9999] = 1; for (i = 1, x = 0; i <= k; i++) for (j = 9999; j >= 0; j--) { a[j] = a[j] * i + x; x = a[j] / 10; a[j] = a[j] % 10; } for (j = 9999; j >= 0; j--) { b[j] = b[j] + a[j];//高精度加法 if (b[j] >= 10) { b[j - 1]=b[j-1]+1; //比如b[3}=b[2]+a[2} b[2]=6 a[2]=6 //b[3]+1;b[2]-10;參照減法算式來看 //如果大於10 前一位+1 b[j] = b[j]-10;//後一位-10 } } } for (i = 0; i < N; i++) if (b[i] != 0) break;//判別逆序輸出 //應該也可以通過strlen判斷位數長度 //或許while!=(('\0')) for (x = i; x < N; x++) printf("%d", b[x]); return 0; }

大抵就是如此,有不懂的可以私信評論詢問,來者不拒。
碼字不易,多多點贊關注+收藏!
愛你們。
在這裡插入圖片描述