首页 > 代码库 > 末三位数

末三位数

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

末三位数