求爱因斯坦数学题.有一条长阶,若每步跨2阶,则最后剩1阶;若每步跨阶,则最后剩2阶;若每步跨5阶,则最后剩4阶;若每步跨7阶,则最后正好一阶不剩.答;#include int main(void){int steps = 29,i = 1;while ( steps % 7 ){steps = (30 * ++i) - 1;}printf("Total steps:%d\n",steps);return 0;}这是书上的答案,我看不懂它的算法,
问题描述:
求爱因斯坦数学题.有一条长阶,若每步跨2阶,则最后剩1阶;若每步跨阶,
则最后剩2阶;若每步跨5阶,则最后剩4阶;若每步跨7阶,则最后正好一阶不剩.
答;
#include
int main(void)
{
int steps = 29,i = 1;
while ( steps % 7 )
{
steps = (30 * ++i) - 1;
}
printf("Total steps:%d\n",steps);
return 0;
}
这是书上的答案,我看不懂它的算法,
答
其实是个数学问题,知道了如何列式算这个题,也就知道算法.
若每步跨2阶,则最后剩1阶;若每步跨3阶,则最后剩2阶;若每步跨5阶,则最后剩4阶,也就是说,每步跨2,3,5阶都是少1阶(即余数为-1).取最小公倍数得总阶数=30*n-1,n为正整数.
于是就有了程序,不断增大n,一直到30*n-1是7的倍数即可,也就满足了所有条件.