第六章 數學問題 -------- 6.7【擴充套件歐幾里得】一步之遙

Curtis_發表於2019-03-22

題目:

一步之遙
從昏迷中醒來,小明發現自己被關在X星球的廢礦車裡。 
礦車停在平直的廢棄的軌道上。 
他的面前是兩個按鈕,分別寫著“F”和“B”。
小明突然記起來,這兩個按鈕可以控制礦車在軌道上前進和後退。 
按F,會前進97米。按B會後退127米。 
透過昏暗的燈光,小明看到自己前方1米遠正好有個監控探頭。 
他必須設法使得礦車正好停在攝像頭的下方,才有機會爭取同伴的援助。 
或許,通過多次操作F和B可以辦到。
礦車上的動力已經不太足,黃色的警示燈在默默閃爍… 
每次進行 F 或 B 操作都會消耗一定的能量。 
小明飛快地計算,至少要多少次操作,才能把礦車準確地停在前方1米遠的地方。
請填寫為了達成目標,最少需要操作的次數。
注意,需要提交的是一個整數,不要填寫任何無關內容(比如:解釋說明等)

思路:

暴力搜尋或者擴充套件歐幾里得演算法( 97x-127y=1  ax+by=m )。

程式碼:

public class 一步之遙 {

    public static void main(String[] args) {
        // 解法一  擴充套件歐幾里得演算法
        try {
            long ans = ExtGcd.linearEquation(97, -127, 1);
            long x = ExtGcd.x;
            long y = ExtGcd.y;
            System.out.println(Math.abs(x) + Math.abs(y));   // 正確答案 97
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        // 解法二 暴力搜尋
        for (int i = 0; i < 100; i++) {
            for (int j = 0; j < 100; j++) {
                if (97*i - 127*j == 1) {
                    System.out.println(Math.abs(i) + Math.abs(j));  // 正確答案 97
                    break;
                }
            }
        }
        
    }
    
    // 私有的靜態的內部類
    private static class ExtGcd{
        static long x,y;
        
        public static long ext_gcd(long a,long b){
            if (b==0) {
                x = 1;
                y = 0;
                return a;
            }
            long res = ext_gcd(b, a%b);
            long x1 = x;
            x = y;
            y = x1-a/b*y;
            return res;
        }
        
        public static long linearEquation(long a,long b,long m) throws Exception{
            long d = ext_gcd(a, b);
            if(m%d!=0) throw new Exception("無解");
            long n = m / d;
            x *= n;
            y *= n;
            return d;
        }
    }

}

 

相關文章