金属战机提供的算法将解决该问题所需的步数减小到了最多1+2+3+4+5+6+7+8+9次,其执行效率把硫酸铜的遍历算法甩开至少10条街。
那么,该算法还有优化的余地吗?答案是肯定的。
考虑到最终得到的b是由b不断加a得到的,因此,提高算法执行过程中的a,就能让b在更少次数内达到正确解。一个快速增大a的思路是,我们先让a,b满足除9余0,再去满足除8余1,以此循环直到满足除5余4。这么做,a的值首先为9,之后分别变为72,504,504,2520。而前述金属战机的算法中a为5,30,210,840,2520。两者的运行结果分别如下:


至此,我们通过调整计算顺序的方式将金属战机的算法优化到了只需9步计算即可找到结果。
现在,考虑calc函数中对a的更新计算:
int t=a;
while(a%c!=0)
a+=t;
显然,这三行代码求的是a与c的最小公倍数。金属战机在这里采用了遍历的方法计算LCM(a,c)——判断a,2a,3a,4a,……是否为c的整数倍。该思路显然还有优化的余地。
对于两个整数x,y,它们的最小公倍数为x * y / GCD(x,y),其中GCD()是最大公约数。最大公约数可通过辗转相除法来计算。于是,算法被进一步优化为:

于是,我们获得了一个效率较高的获得该类问题通解的方法。