高精度階乘和 高精度演算法
阿新 • • 發佈:2021-02-14
以前刷oj的時候 遇見一個題目 也就是輸入一個數字 判斷階乘和
用高精度計算出S=1!+2!+3!+…+N!(N≤50),其中"!"表示階乘,
例如:5!=5*4*3*2*1。
輸入正整數N,輸出計算結果S。
輸入
每個測試檔案只包含一組測試資料,每組輸入一個正整數N。
輸出
對於每組輸入資料,輸出階乘和的計算結果。
樣例輸入 Copy
3
樣例輸出 Copy
9
其實看起來還簡單?當然只是對於部分資料如此,比如好像十幾以後的階乘就已經error了,這裡就要用到今天的主角,高精度演算法。
關於高精度的基本加法我寫過 連結在這裡
因為加法是基礎
所謂高精度的思想是什麼呢?無非就是放入幾個數字 挨個加,看是不是大於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;
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;
}
大抵就是如此,有不懂的可以私信評論詢問,來者不拒。
碼字不易,多多點贊關注+收藏!
愛你們。