“水仙花数”和“斐波纳契数列”

一、题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个"水仙花数",因为153 = 1的三次方+5的三次方+3的三次方。

程序分析:利用 for 循环控制100-999个数,每个数分解出个位,十位,百位。

代码实现如下:

  1 public class Lotus{
  2 	public static void main(String[] args){
  3 		for(int i=100;i<1000;i++){
  4 			if(isLotus(i))
  5 			System.out.print(i+"");
  6 		}
  7 		System.out.println();
  8 	}
  9 	//判断水仙花数
 10 	private static boolean isLotus(int lotus){
 11 		int m = 0;
 12 		int n = lotus;
 13 		int sum = 0;
 14 		m = n/100;
 15 		n  -= m*100;
 16 		sum = m*m*m;
 17 		m = n/10;
 18 		n -= m*10;
 19 		sum += m*m*m + n*n*n;
 20 		if(sum==lotus)
 21 			return true;
 22 		else
 23 			return false;
 24 		}
 25 }

 

二、题目:编写程序在控制台输出斐波那契数列前20项,每输出5个数换行

基础知识:

斐波纳契数列,又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……

在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)。

代码实现一:

  1 public class Fibonacci1 {
  2 	// 定义三个变量方法
  3 	public static void main(String[] args) {
  4 		int a = 1, b = 1, c = 0;
  5 		System.out.println("斐波那契数列前20项为:");
  6 		System.out.print(a + "\t" + b + "\t");
  7 		//因为前面还有两个1、1 所以i<=18
  8 		for (int i = 1; i <= 18; i++) {
  9 			c = a + b;
 10 			a = b;
 11 			b = c;
 12 			System.out.print(c + "\t");
 13 			if ((i + 2) % 5 == 0)
 14 				System.out.println();
 15 		}
 16 	}
 17 
 18 }

代码实现二:

  1 public class Fibonacci2 {
  2 	// 定义数组方法
  3 	public static void main(String[] args) {
  4 		int arr[] = new int[20];
  5 		arr[0] = arr[1] = 1;
  6 		for (int i = 2; i < arr.length; i++) {
  7 			arr[i] = arr[i - 1] + arr[i - 2];
  8 		}
  9 		System.out.println("斐波那契数列的前20项如下所示:");
 10 		for (int i = 0; i < arr.length; i++) {
 11 			if (i % 5 == 0)
 12 				System.out.println();
 13 			System.out.print(arr[i] + "\t");
 14 		}
 15 	}
 16 
 17 }

代码实现三:

  1 public class Fibonacci3 {
  2 	// 使用递归方法
  3 	private static int getFibo(int i) {
  4 		if (i == 1 || i == 2)
  5 			return 1;
  6 		else
  7 			return getFibo(i - 1) + getFibo(i - 2);
  8 	}
  9 
 10 	public static void main(String[] args) {
 11 		System.out.println("斐波那契数列的前20项为:");
 12 		for (int j = 1; j <= 20; j++) {
 13 			System.out.print(getFibo(j) + "\t");
 14 			if (j % 5 == 0)
 15 				System.out.println();
 16 		}
 17 	}
 18 
 19 }

 

此问题的演变:

有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少?

程序分析: 兔子的规律为数列:1,1,2,3,5,8,13,21,……

代码实现如下:

  1 public class Rabbit {
  2 	public static void main(String[] args){
  3 		int n = 10;
  4 		System.out.println(""+n+"个月兔子总数为"+fun(n));
  5 	}
  6 	private static int fun(int n){
  7 		if(n==1 || n==2)
  8 		   return 1;
  9 		else
 10 		   return fun(n-1)+fun(n-2);
 11 	}
 12 }
posted @ 2017-05-31 18:46  长情白月光  阅读(544)  评论(0编辑  收藏  举报