末三位数

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

时间: 2024-08-30 07:28:42

末三位数的相关文章

02-3. 逆序的三位数(10)

程序每次读入一个正3位数,然后输出按位逆序的数字.注意:当输入的数字含有结尾的0时,输出不应带有前导的0.比如输入700,输出应该是7. 输入格式: 每个测试是一个3位的正整数. 输出格式: 输出按位逆序的数. 输入样例: 123 输出样例: 321 注:测试数据都是3位正整数,末位带零逆序不能显示 #include "stdio.h" int main() { int a; scanf("%d",&a); if((a%10)>0) { printf(

C 数字1、2、3、4用不全相等的数字组成的三位数及其个数

# include<stdio.h> int main() { int i,j,k; int x=0,y=0,z=0; for(i=1;i<5;i++) { for(j=1;j<5;j++) { for(k=1;k<5;k++) { if(!(i==j&&j==k&&i==k)) //if(i!=j&&j!=k&&i!=k)注意这段代码的表示的意思! { printf("%d%d%d  ",i

逆序的三位数C语言实现

最近在上浙江大学翁恺老师的<程序设计入门-C语言>课,翁老师那富有男性特有魅力的磁性嗓音深深吸引了我....虽然我是男的.课程首周有个测试题: 题目内容: 程序每次读入一个正三位数,然后输出逆序的数字.注意,当输入的数字含有结尾的0时,输出不应带有前导的0.比如输入700,输出应该是7. 输入格式: 每个测试是一个3位的正整数. 输出格式: 输出逆序的数. 输入样例: 123 输出样例: 321 难度不大,很快就写出来了,在线提交了测试通过了,代码如下,写在博客上留作纪念,方便以后查看吧. P

华为机试 --- 求最大三位数

题目:输入10位0-9数字,取其中三位不同数字组合,求组合出来的最大三位数. 如输入 1 2 3 4 5 6 7 8 9 0,组合出来987最大. 测试代码如下: #include <stdio.h> #include <stdlib.h> int IsSame(int *a, int num); int main() { int i=0; int j=0; int a[10]={0}; int input =0; int length =0; int temp=0; for (i

打印出所有的&quot;水仙花数&quot;,所谓&quot;水仙花数&quot;是指一个三位数,其各位数字立方和等于该数本身。

package com.mumu.ready; public class Daffodils { // 题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身. // 例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方. public static void main(String[] args) { for (int i = 100; i < 1000; i++) { in

有1、2、3、4四个数字,能组成多少个互不相同且一个数字中无重复数字的三位数?并把他们都输出。

/** * 有1.2.3.4四个数字,能组成多少个互不相同且一个数字中无重复数字的三位数?并把他们都输出. * */ public class Test1 { public static void main(String[] args) { int num = 0, c = 0; for (int i = 1; i <= 4; i++) { for (int j = 1; j <= 4; j++) { for (int k = 1; k <= 4; k++) { if (i != j &

有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

代码: package com.liron.p1; /** * 有1.2.3.4个数字,能组成多少个互不相同且无重 * 复数字的三位数?都是多少? */ public class Topic1 { public static void main(String[] args) { int i=0; //保存百位上的数 int j=0; //保存十位上的数 int k=0; //保存各位上的数 int t=0; //保存数字个数 for(i=1;i<=4;i++){ for(j=1;j<=4;j+

1107: 零起点学算法14——三位数反转

1107: 零起点学算法14--三位数反转 Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 4915  Accepted: 2378[Submit][Status][Web Board] Description 水题 Input 输入1个3位数(题目包含多组测试数据) Output 分离该3位数的百位.十位和个位,反转后输出(每组测试数据一行) Sample Input 250 Sample Out

Java循环练习: 有1、2、3、4四个数字,能组成多少个无重复数字的三位数?都是多少?

package practiceGO; /**         有1.2.3.4四个数字,能组成多少个无重复数字的三位数?都是多少?  */ public class Cto { public static void main(String[] args) { int count = 0; for(int i=1; i<=4; i++){ for(int j=1; j<=4; j++){ for(int k=1; k<=4; k++){ if (i!=j && i!=k