csdn上的一道编程练习题,我觉得称为(3 + √5)^n问题更贴切些
与其说这是一道编程题,不如说这是一道数论推导题。
好了,言归正装,下面开始题解
题意:让求(3 + √5)^n 的末三位数是多少,输出即可
首先令 an=(3 + √5)^n + (3 - √5)^n 这个an是一个整数,也就是一个整数可以用两个无理数表示,有人问了,为什么an是一个整数呢?
其实证明很简单,只需用(3 + √5) ^n和 (3 - √5)^n到高中所学的二次项分解即可,将(3 + √5)^n 和 (3 - √5)^n 分别进行二次项分解然后相加就会发现,无理数的次方全是奇数,二者正好抵消,剩下的全是整数的项。
如果我们能求出an , 期中(3 - √5)^n 是一个小于1的数,(3 + √5)^n=an-(3 - √5)^n 所以,(3 + √5)^n 的末三位数也就是an-1 的末三位数
所以求出an就可以了,怎么去求an呢?
想到斐波那契数列 an=a(n-1)+a(n-2) 在这我们求an也利用这个思想,令 an=p*a(n-1)+q*a(n-2) 下面的问题就是去求参数p和q的值
再者,(3 + √5) 和 (3 - √5) 是 某个二次方程的两个根,利用求根公式可以得到这个二次方程为 x^2-6*x+4=0 变换方程得 x^2=6*x-4
两个方程的形式很像,所以可以推到出 p=6 q=-4;
知道了an=6*a(n-1)-4*a(n-2) 期中a(0)=2 a(1)=6 a(2)=28其他的数字就完全可以求出来了。
细心的人如果打印出这个an数列的后三位,其实它是个循环往复的,找到这个规律的话,会使复杂度降的更低。
代码我就不贴了,大家自己写喽
参考博客:http://blog.csdn.net/dahlwuyn/article/details/28647131