第六章 数学问题 -------- 6.7【扩展欧几里得】一步之遥

题目:

一步之遥
从昏迷中醒来,小明发现自己被关在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;
        }
    }

}

猜你喜欢

转载自blog.csdn.net/OpenStack_/article/details/88729683
今日推荐