標籤:java基礎編程題 斐波那契數列 判斷素數 水仙花數 原始碼
一、題目描述
1、古典問題:有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子,假如兔子都不死,問每個月的兔子對數為多少?
程式分析: 兔子的規律為數列1,1,2,3,5,8,13,21.... ,該題其實就是斐波那契數列的一種。
2、判斷m-n之間有多少個素數,並輸出所有素數。
程式分析:判斷素數的方法:用一個數n分別去除2到sqrt(n),這裡是Math內建的函數sqrt()求該數的平方根,如果能被整除,則表明此數不是素數,反之是素數。
3、列印出所有的"水仙花數",所謂"水仙花數"是指一個三位元,其各位元字立方和等於該數本身。
例如:153是一個"水仙花數",因為153=1的三次方+5的三次方+3的三次方。
程式分析:利用for迴圈控制100-999個數,每個數分解出個位,十位,百位,然後判斷是否滿足各位元字立方和等於該數本身。
二、JAVA原始碼
1、程式1
package tong.yue.hong;import java.util.Scanner;import javax.xml.transform.Templates;/** * 題目:古典問題:有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子,假如兔子都不死,問每個月的兔子對數為多少? 程式分析: 兔子的規律為數列1,1,2,3,5,8,13,21.... 總之,除了第一個和第二個月兔子數量為1,其他月份是前兩個月份兔子對數之和。 * @author tong * */public class Fibonacci {public static void main(String[] args) {System.out.println("請輸入第幾個月:");Scanner scanner = new Scanner(System.in);String month = scanner.nextLine();diedai(Integer.parseInt(month));digui(Integer.parseInt(month));System.out.println("第"+month+"個月有兔子"+digui(Integer.parseInt(month))+"對");}/** * 使用遞迴的方法求該數列,原始碼簡單,但是效率比較低,記憶體消耗大 * @param parseInt * @return */private static int digui(int parseInt) {if(parseInt==1||parseInt==2){return 1;}else{return digui(parseInt-1)+digui(parseInt-2);}}/** * 使用普通的方法,根據該數列的特性,除了第一個和第二個月兔子數量為1,其他月份是前兩個月份兔子對數之和。 * @param parseInt */private static void diedai(int parseInt) {int first = 1;int second = 1;int temp = 0;for (int i = 3; i <=parseInt; i++) {temp = first;first = second;second = temp+second;System.out.println("第"+i+"個月有兔子"+second+"對");}}}
2、程式二
package tong.yue.hong;import java.util.Scanner;/* * 題目:判斷m-n之間有多少個素數,並輸出所有素數。 程式分析:判斷素數的方法:用一個數分別去除2到sqrt(這個數),如果能被整除,則表明此數不是素數,反之是素數。 */public class Sushu {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("請輸入數字下限:");int low = scanner.nextInt();System.out.println("請輸入數字上限:");int high = scanner.nextInt();if (low>high) {System.out.println("您輸入的資料有誤,請重新輸入!");System.out.println("請輸入數字下限:");low = scanner.nextInt();System.out.println("請輸入數字上限:");high = scanner.nextInt();}System.out.println(low+"-"+high+"之間的所有素數:");int count = 0;for (int i = low; i <= high; i++) {if(isPrime(i)){count ++;System.out.print(i+" ");//每輸出10個素數就換行,便於觀察if(count%10==0){System.out.println();}}}System.out.println("\n總共"+count+"個素數");}/** * 該方法用來判斷一個數是否為素數,判斷條件是將該數除以從2開始到sqrt(該數),只要有一個能整除就不是素數,所有數都不能整除即素數 * @param i * @return */private static boolean isPrime(int i) {if (i==1) {return false;}for (int j = 2; j < Math.sqrt(i); j++) {if(i%j==0){return false;}}return true;}}
3、程式3
package tong.yue.hong;/** * 列印出所有的"水仙花數",所謂"水仙花數"是指一個三位元,其各位元字立方和等於該數本身。例如:153是一個"水仙花數",因為153=1的三次方+5的三次方+3的三次方。 程式分析:利用for迴圈控制100-999個數,每個數分解出個位,十位,百位。 * @author Administrator * */public class Shuixianhua {public static void main(String[] args) {System.out.println("100-999之間的水仙花數:");//使用isShuixianhua()方法for (int i = 100; i < 1000; i++) {if(isShuixianhua(i)){System.out.print(i+" ");}}System.out.println("\n100-999之間的水仙花數:");//使用isLotus()方法for (int i = 100; i < 1000; i++) {if(isLotus(i)){System.out.print(i+" ");}}}/** * 這裡調用java內建的pow()方法求一個數的3次方 * @param i * @return */private static boolean isShuixianhua(int i) {//擷取個位:i%10,擷取十位:i/10%10,擷取百位:i/100int sum = (int)(Math.pow(i%10, 3)+Math.pow(i/10%10, 3)+Math.pow(i/100, 3));if (i==sum) {return true;}return false;}/** * 這雷根據各位的資料關係將每個位上的數字取出並判斷 * @param num * @return */private static boolean isLotus(int num){int m = 0;int n = num;int sum = 0;//擷取百位m = n/100;//來源資料減去百位元乘以100就剩下十位和個位n -= m*100;//百位元求立方sum = m*m*m;//擷取十位m = n/10;//資料減去十位的部分就剩下個位的資料n -= m*10;//判斷各位元字立方和等於該數本身sum += m*m*m + n*n*n;if(sum==num)return true;elsereturn false;}}
JAVA基礎編程50題(1-3題)詳解