由題知計算階乘之和,我們可以用for循環計算每一次的值把總和放在BigInteger然后進行判斷。但是這樣明顯過于麻煩,我們可以利用數學的本質去思考這個問題,以0結尾的數字乘以一個數字必定為0,階乘之中必定有2和5結尾的數字相乘得0,這個0的階乘和下一個數字相乘的結尾又必定為0,倆個數字求和也必定為0;依此類推后面幾位數字必定為0;題目提示首位不為0。
根據此我們可以使用mod的運算法則
-
加法法則:(a + b) % p = (a % p + b % p) % p$
-
減法法則:(a - b) % p = (a % p - b % p) % p$
-
乘法法則:(a * b) % p = (a % p * b % p) % p
-
冪運算法則:a^b % p = ((a % p)^b) % p$(除法例外)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?每次運算時mod九位數字即可,代碼如下👇? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
public static void main(String[] args) {long sum=0;long num=1;for (int i = 2; i < 22; i++) {//long數據到22就溢出為負值num*=i;sum+=num;System.out.println(sum);}}
每次mod9只要最后9位進行運算
public static void main(String[] args) {long sum=0;long num=1;for (int i = 2; i < 100; i++) {//循環100次找到重復的正確結果num*=i;sum+=num;num%=1e9;sum%=1e9;System.out.println(sum);}
還可以加上判斷條件直接輸出標準答案
public static void main(String[] args) {long sum=0;long num=1;long a=0;for (int i = 2; i < 100; i++) {num*=i;sum+=num;num%=1e9;sum%=1e9;if (sum==a) {//說明已經相同了break;}a=sum;//重新賦值}System.out.println(sum);}
解題代碼留了一個BUG,請大家仔細分析!