/*一步之遥
从昏迷中醒来,小明发现自己被关在X星球的废矿车里。
矿车停在平直的废弃的轨道上。
他的面前是两个按钮,分别写着“F”和“B”。
小明突然记起来,这两个按钮可以控制矿车在轨道上前进和后退。
按F,会前进97米。按B会后退127米。
透过昏暗的灯光,小明看到自己前方1米远正好有个监控探头。
他必须设法使得矿车正好停在摄像头的下方,才有机会争取同伴的援助。
或许,通过多次操作F和B可以办到。
矿车上的动力已经不太足,黄色的警示灯在默默闪烁...
每次进行 F 或 B 操作都会消耗一定的能量。
小明飞快地计算,至少要多少次操作,才能把矿车准确地停在前方1米远的地方。
请填写为了达成目标,最少需要操作的次数。
注意,需要提交的是一个整数,不要填写任何无关内容(比如:解释说明等)*/
****以下是啰嗦****
先问一个简单的问题 :求 6 和 8 的最小公倍数
求 6 和 8 的最小公倍数
也就是求 使6A==8B成立的 最小A、B
这里对其进行处理
6A-8B=0 也就是 -2B+6(A-B)=0 记为 -2B+6C=0
-2B+6C=0 也就是 0C-2(B-3C)=0 记为 0C-2D=0
于是 D=0
为求得最小A、B,需要令C=1
(不可以C=0,这样会使A、B为0)
B-3C=D 那么 B=3C+D=3
A-B=C 那么 A=B+C=4
最小公倍数就是 6A 也是 8B : 24
从这个角度看,本题只是对此稍作修改
求 使 97A-127B==1 成立的 最小A、B
使用同样的方法
97A-127B=1 也就是 -30B+97(A-B)=1 记为 -30B+97C=1
-30B+97C=1 也就是 7C-30(B-3C)=1 记为 7C-30D=1
7C-30D=1 也就是 -2D+7(C-4D)=1 记为 -2D+7E=1
-2D+7E=1 也就是 1E-2(D+3E)=1 记为 1E-2F=1
这样显然很简单了,可以算出E、F,但是我还想继续一次
1E-2F=1 也就是 0F+1(E-2F)=1 记为 0F+1G=1
这样就更明显了
当 G=1 时等式就成立了,再令F=1
再依次计算出E、D、C、B、A
这里重复步骤 ai*Ai+bi*Bi=1 转换成 (bi%ai)*A(i+1)+ai*B(i+1)=1
也需要回头计算出值
于是决定使用递归
**** ****
#include <stdio.h>
#define TYPE struct M
TYPE
{
int aa;
int bb;
};
TYPE _f(int a, int b)
{
if(a==0)return (TYPE){0, 1};
struct M m=_f(b%a, a);
return (TYPE){ m.bb-(b/a)*m.aa, m.aa};
}
int main()
{
int a=97;
int b=-127;
TYPE m=_f(a, b);
printf("%d", m.aa+m.bb);
return 0;
}
之后随性加上了 最小公倍数、最大公约数的计算
#include <stdio.h>
#define TYPE struct M
int GO=1;
int BASE=0; // GO^1
TYPE
{
int aa;
int bb;
};
TYPE _f(int a, int b)
{
if(a==0)return (TYPE){BASE, GO};
struct M m=_f(b%a, a);
return (TYPE){ m.bb-(b/a)*m.aa, m.aa};
}
int main()
{
int a=97;
int b=-127;
//a=6;
//b=8;
TYPE m=_f(a, b);
// GO=0;
// BASE=1;
//printf("%d", m.aa*a);
// 最小公倍数
//printf("%d", b/m.aa);
// 最大公约数
// (a*b)/(m.aa*a)
GO=1;
BASE=0;
printf("%d", m.aa+m.bb);
// 前进 GO 的总步数
return 0;
}