数学知识的应用(一步之遥--暴力、欧几里得)
2018-03-18 23:34
176 查看
从昏迷中醒来,小明发现自己被关在X星球的废矿车里。 矿车停在平直的废弃的轨道上。 他的面前是两个按钮,分别写着“F”和“B”。 小明突然记起来,这两个按钮可以控制矿车在轨道上前进和后退。 按F,会前进97米。按B会后退127米。 透过昏暗的灯光,小明看到自己前方1米远正好有个监控探头。 他必须设法使得矿车正好停在摄像头的下方,才有机会争取同伴的援助。 或许,通过多次操作F和B可以办到。 矿车上的动力已经不太足,黄色的警示灯在默默闪烁... 每次进行 F 或 B 操作都会消耗一定的能量。 小明飞快地计算,至少要多少次操作,才能把矿车准确地停在前方1米远的地方。 请填写为了达成目标,最少需要操作的次数。
方法一(暴力破解,比较简单易懂):
package sf_04; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub for(int x=0;x<100;x++){ for(int y=0;y<100;y++){ if(97*x-127*y==1) System.out.println("x="+x+";y="+y); } } } }
方法二(采用的是欧几里得定理,也许是我数学不好,没看懂)
/* 解不定方程 97x + 127y = 1 欧几里得定理 ---- 辗转相除法 4000 gcd 扩展欧几里得定理 Ax + By = gcd(A,B) 理论基础: gcd(A,B) == gcd(B,A%B) 求出特解后,通解很好表示 Ax + By = gcd(A,B) Ax + By = gcd(B,A%B) B(A/B x + y) + (A%B)x = gcd(B,A%B) 对比: A/B x + y = 新x x = 新y */ public class A { // 返回最大公约数 // xy: 顺便解出的xy static int e_gcd(int A, int B, int[] xy) { if(B==0){ xy[0] = 1; xy[1] = 0; return A; } int ans = e_gcd(B, A%B, xy); int t = xy[0]; xy[0] = xy[1]; xy[1] = t - A/B * xy[0]; return ans; } public static void main(String[] args) { int[] xy = new int[2]; int a = e_gcd(97,127,xy); System.out.println(a); System.out.println(xy[0] + " " + xy[1]); } }
相关文章推荐
- SGU261 一些数学知识入门与应用结合 原根 快速幂 离散对数 扩展欧几里得 单边元模线性方程
- 数学知识的应用(日期差问题)
- 暴力拆解《Numerical Optimization》之器材准备(数学知识补充)
- 编程中数学知识的应用
- 蓝桥杯赛前冲刺补习第四课——《数学知识的应用》
- 【知识贴】战争中的数学应用
- 【知识贴】战争中的数学应用
- 【Unity引擎学习】数学知识在游戏开发中的应用
- 数学知识在地图开发中的应用
- 数学知识的应用(天枰称重)
- 数学知识的应用(模m运算)
- 数学知识的应用(使用了BigInteger,1/3+1/6=1/2)
- 数学知识的应用
- 【Cocos2D学习】Lua——数学知识的基本应用
- ACM-数学知识的算法应用
- 数学/物理知识在软件/算法中应用(1)
- 蓝桥杯C语言培训4 数学知识的运用 例题5 一步之遥
- MATLAB学习之基本操作和在高等数学的应用
- 一些vc的基本知识,创建应用实例的步骤