一道有趣奥数题——“丢番图的墓志铭”



    丢番图(Diophantus)是古希腊亚历山大学后期的重要学者和数学家(约公元246—330年)丢番图是代数学的创始人之一,对算术理论有深入研究,他完全脱离了几何形式,在希腊数学中独树一帜。我从网上只能找到一幅丢番图的画像,如下:

一道有趣奥数题——“丢番图的墓志铭”_第1张图片

    丢番图死后在墓志铭上刻有一段有趣的文字:以下数字可以告诉你他的一生有多长——他生命的六分之一是愉快的童年,再过了生命的十二分之一,面颊上长了细细的胡须;又过了生命的七分之一他结婚了。婚后5年,他有了第一个孩子,感到很幸福,但命运给这个孩子的光辉灿烂的生命只有他父亲的一半。儿子死后,他在深切的悲痛中活了四年就告别了尘世。问题来了:请问丢番图的年龄有多大?

    这段墓志铭是麦特罗尔为了纪念数学家丢番图为数学作出的杰出贡献而撰写的,同时这也是一个经典的数学问题。我们今天来看一下如何用计算机程序解决丢番图的墓志铭问题。
     假设丢番图一生活了x岁,那么根据墓志铭的叙述可得出以下的方程式:



我们应用穷举法可以简单方便地解决这类一元一次方程问题。首先划定一个解空间,然后在该解空间中遍历每一个可能解,凡是符合上述方程条件的元素都是该问题的解。由于上述为一元一次方程,因此该问题存在唯一解。




下面给出源代码。

#include "stdio.h"

main()
{
    float i;
    for(i = 20.0;i<100.0;i++)
    {
        if(i/6.0+i/12.0+i/7.0+5.0+i/2.0+4.0 == i)
        {
            printf("Diophantus lived %d years\n",(int)i);
        }
    }
}

     本程序选取的解空间为[20,100],因为已知丢番图已经有了儿子,并且儿子活了他的年龄的一半就去世了,而丢番图仍然活着。根据常识丢番图肯定活过了20岁,而丢番图活过100岁的可能性也不大。因此选定在20~100之间搜索答案,这样可以减小搜索范围,以尽快得到结果。
    之所以采用浮点型数据进行运算是因为这样可以避免因整数运算而造成的舍入误差。例如:整数运算12/6等于2,而13/6也等于2,这样势必产生误差。为了获取精确值,这里采用浮点数运算。


     程序的运行结果为84


丢翻图活了84,我们再翻回头看看丢先生的生卒年份“约公元246—330年”,看来我们的计算是没错的。







你可能感兴趣的:(编程,算法,面试题)