1. 程式人生 > >【擴展歐幾裏得】一步之遙

【擴展歐幾裏得】一步之遙

說明 擴展歐幾裏得算法 str cat long -a hellip 暴力搜索 攝像頭

題目:

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

思路:暴力搜索或者擴展歐幾裏得算法( 97x-127y=1 ax+by=m )

代碼:

 1 public class 一步之遙 {
 2 
 3     public static void main(String[] args) {
 4         // 解法一  擴展歐幾裏得算法
 5         try {
 6             long ans = ExtGcd.linearEquation(97, -127, 1);
 7             long x = ExtGcd.x;
 8             long y = ExtGcd.y;
9 System.out.println(Math.abs(x) + Math.abs(y)); // 正確答案 97 10 } catch (Exception e) { 11 e.printStackTrace(); 12 } 13 14 // 解法二 暴力搜索 15 for (int i = 0; i < 100; i++) { 16 for (int j = 0; j < 100; j++) { 17 if
(97*i - 127*j == 1) { 18 System.out.println(Math.abs(i) + Math.abs(j)); // 正確答案 97 19 break; 20 } 21 } 22 } 23 24 } 25 26 // 私有的靜態的內部類 27 private static class ExtGcd{ 28 static long x,y; 29 30 public static long ext_gcd(long a,long b){ 31 if (b==0) { 32 x = 1; 33 y = 0; 34 return a; 35 } 36 long res = ext_gcd(b, a%b); 37 long x1 = x; 38 x = y; 39 y = x1-a/b*y; 40 return res; 41 } 42 43 public static long linearEquation(long a,long b,long m) throws Exception{ 44 long d = ext_gcd(a, b); 45 if(m%d!=0) throw new Exception("無解"); 46 long n = m / d; 47 x *= n; 48 y *= n; 49 return d; 50 } 51 } 52 53 }

【擴展歐幾裏得】一步之遙