(題目描述略)
本題可以用高精度暴力求解,但**量過大。我們在這裡有一種優化的思路。
由於 n! + (n - 1)! + (n - 2)! + .. + 2! + 1! = (..((((0 + 1) * n + 1) * (n - 1) + 1) * (n - 2) + 1) * .. * 2 + 1) * 1,所以我們可以得出以下演算法:
第一步:令 ans := 0,讀入 n;
第二步:令 ans := (ans + 1) * n,令 n := n - 1;
第三步:判斷是否 n > 0,若是則轉第二步,若否則轉第四步;
第四步:輸出 ans。
將以上演算法套入高精度,即為本題的優化演算法。
**如下:
#include"stdio.h"
#include"string.h"
int answer[20];
int main()
printf("%d",answer[m--]);
while(m>=0)
printf("%04d",answer[m--]);
return
0;}
為了方便起見,作者的**採用了萬進製的優化方法。
經過以上優化,我們可以發現,相對於樸素演算法而言,我們已經省去了乙個高加高的過程,並節省了乙個高精度陣列。更為重要的是,我們壓縮了**量,使之更易編寫和除錯。
由於本題資料過弱,所以不需要高精度快速冪 o(logn) 的演算法,只需要樸素的 o(n) 的演算法便足以通過。
P1011 NOIP1998 提高組 車站
不妨設第 2 站上車和下車的乘客數量均為 y 站編號上車人數 下車人數 開出時車上人數 1 a 0 a 2 y y a 3 a y y 2a 4 a 2y a y 2a y 5 2a 3y a 2y 3a 2y 6 3a 5y 2a 3y 4a 4y 7 5a 8y 3a 5y 6a 7y 但 y ...
NOIp1998 T2 拼數(字串,排序)
設有n個正整數 n 20 將它們聯接成一排,組成乙個最大的多位整數。例如 n 3時,3個整數13,312,343聯接成的最大整數為 34331213 又如 n 4時,4個整數7,13,4,246聯接成的最大整數為 7424613 第一行,乙個正整數n。第二行,n個正整數。乙個正整數,表示最大的整數 ...
藍橋杯練習2之階乘計算
問題描述 輸入乙個正整數n,輸出n 的值。其中n 123 n。演算法描述 n 可能很大,而計算機能表示的整數範圍有限,需要使用高精度計算的方法。使用乙個陣列a來表示乙個大整數a,a 0 表示a的個位,a 1 表示a的十位,依次類推。將a乘以乙個整數k變為將陣列a的每乙個元素都乘以k,請注意處理相應的...