表示式展開-LintCode

weixin_34075551發表於2017-12-11

1、給出兩個數 A 和 B, 其中 B >= A. 我們需要計算結果 F 的最後一位數是什麼, 其中F = B! / A!(1 <= A, B <= 10^18, A 和 B 非常大)(難度:中等)【建議時間:40分鐘】
樣例 :
給出 A = 2, B = 4, 返回 2
A! = 2 以及 B! = 24, F = 24 / 2 = 12 –> 最後一位數為 2

注意程式設計風格。(比較關注這個,我們認為這和你工作中程式碼質量有較強關聯)

————————————————————————————————————

思路:

階乘除法B! / A!的本質是B * B-1 * … * A+1,要想獲得末尾數字,只需要計算這個算式本身的末位數字的運算即可,且當B - A >= 10的時候,結果必為0(因為B比A大10以上則證明上述算式必包含一個數為10的倍數,則乘積結果必為10的倍數,也就是最後一位為0) 
當B - A的結果在10以內時,考慮到乘積結果仍然可能超過long的範圍,我們仍需選取最後一位進行運算. 這時候我們又有兩種情況需要討論: 
①B的末位數字小於A(讓Btemp = B末位數字 + 10) 
②B的末位數字大於A(正常處理)

答案:

public class Solution {
  public int computeLastDigit(long A, long B) {
    if (B - A >= 10) {
        return 0;
    }
    long Atemp = A % 10;
    long Btemp = B % 10;
    if(Atemp > Btemp){
        Btemp += 10;
    }
    long ret = 1;
    for (long i = Btemp; i > Atemp; i--) {
        ret *= i;
    }

    return (int) (ret % 10);
  }

  public static void main(String[] args) {
    long A = 123213125l;
    long B = 123213129l;
    System.out.println(“輸入引數:A=”+A +“,B=”+B);
        System.out.println(new Solution().computeLastDigit(A,B));
  }
 }

相關文章