1. 程式人生 > >JAVA基礎程式設計50題(19-21題)詳解

JAVA基礎程式設計50題(19-21題)詳解

一、描述

題目1:
  打印出如下菱形圖案(菱形)
    *
   *** 
  ***** 
 ******* 
  ***** 
   *** 
    * 
程式分析:先把圖形分成兩部分來看待,前四行一個規律,後三行一個規律,利用雙重 for迴圈,外層控制行,內層控制列。
對該題進行擴充套件:由使用者輸入上半部分的行數,根據行數產生任意行的菱形,如圖為使用者輸入數字5時的結果

     *
    ***
   *****
  *******
 *********
  *******
   *****
    ***
     *
我們採用兩種方法來實現,一種是分上半部分和下半部分分別列印,一個是直接通過條件判斷,整個一起列印。

題目2:有一分數序列:2/1,3/2,5/3,8/5,13/8,21/13...求出這個數列的前20項之和。

程式分析:請抓住分子與分母的變化規律,分子從第三項開始,都是前一項分子和分母之和;分母=前一項的分子。
        在前面多加1/1項,不計算進該數列,找出項之間的關係; 後項分母=前項分子;後項分子=前項分子+前項分母

題目3:求1+2!+3!+...+20!的累加和 。

二、原始碼

程式1:

<span style="font-size:14px;">package tong.yue.day2;


import java.util.Scanner;


/**
 * 打印出如下圖案(菱形)
    *
   *** 
  ***** 
 ******* 
  ***** 
   *** 
    * 
程式分析:先把圖形分成兩部分來看待,前四行一個規律,後三行一個規律,利用雙重 for迴圈,外層控制行,內層控制列。
對該題進行擴充套件:由使用者輸入上半部分的行數,根據行數產生任意行的菱形,如圖為使用者輸入數字5時的結果


     *
    ***
   *****
  *******
 *********
  *******
   *****
    ***
     *
我們採用兩種方法來實現,一種是分上半部分和下半部分分別列印,一個是直接通過條件判斷,整個一起列印。
 * @author tong
 *
 */


public class PrintDiamond {


	public static void main(String[] args) {
		
		Scanner scanner = new Scanner(System.in);
		System.out.println("請輸入上半部分的行數(大於0,小於20的正整數):");
		int line = scanner.nextInt();
		if (line<=0||line>20) {
			System.out.println("輸入資料有誤,請重新輸入上半部分的行數(大於0,小於20的正整數):");
			line = scanner.nextInt();
		}		
		printDiamondByOneFor(line);
		System.out.println("-------------");
		printDiamondByTwoFor(line);
		
	}
	
	 //列印菱形
	private static void printDiamondByOneFor(int n){
		//根據圖形找關係,輸入的是上半部分的行數,而列印的"*"與行數滿足(2*行號-1)的關係;
		//該圖形中間最大的"*"數與輸入的上半部分行數的關係為(2*n-1)
		//而兩倍的空格數加上"*"號個數為中間最大行行數。
		for (int i = 1; i <= 2*n-1; i++) {
			//列印上半部分
			if (i<=n) {
				//空格數的兩倍=中間最大的"*"數-當前行"*"個數
				for (int j = 1; j <= ((2*n-1)-(2*i-1))/2; j++) {
					System.out.print(" ");
				}
				//當前行打印出的"*"
				for (int j = 1; j <= 2*i-1; j++) {
					System.out.print("*");
				}
			//列印下半部分
			}else {
				//列印的空格數=當前行號-輸入的上半部分行數
				for (int j = 1; j <= i-n; j++) {
					System.out.print(" ");
				}
				//"*"數=中間最大的"*"數-當前行空格個數*2
				for (int j = (2*n-1)-2*(i-n); j >=1 ; j--) {
					System.out.print("*");
				}
			}
			System.out.println();
		}
	}
	
	  //列印菱形
	private static void printDiamondByTwoFor(int n){
		//列印上半部分
		for(int i=0;i<n;i++){
			for(int j=0;j<2*n;j++){
		  	if(j<n-i){
		  	  System.out.print(" ");
		  	}else {
		  		if(j<=n+i){
				  	  System.out.print("*");
		  		}
			}
		  	
		  }
		  System.out.println();
		}
		//列印下半部分
		for(int i=1;i<n;i++){
			System.out.print(" ");
			for(int j=0;j<2*n-i;j++){
				if(j<i){
					System.out.print(" ");
				}else {
					if(j<2*n-i-1){
					  	  System.out.print("*");
					}
				}
			}	  	  
		  	
			System.out.println();
		}
	}


}
</span>
執行結果:

菱形

程式2:

<span style="font-size:14px;">package tong.yue.day2;


import java.util.Scanner;


/**
 * 有一分數序列:2/1,3/2,5/3,8/5,13/8,21/13...求出這個數列的前20項之和。
         程式分析:請抓住分子與分母的變化規律,分子從第三項開始,都是前一項分子和分母之和;分母=前一項的分子。
         在前面多加1/1項,不計算進該數列,找出項之間的關係
         後項分母=前項分子
         後項分子=前項分子+前項分母
 * @author tong
 *
 */


public class Fraction {


	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("請輸入加和的項數(<=50):");
		int line = scanner.nextInt();
		if (line<=0||line>50) {
			System.out.println("輸入資料有誤,請重新輸入加和的項數(<=50):");
			line = scanner.nextInt();
		}			
		printSum(line);
	}


	private static void printSum(int line) {
				
		double denominator = 1;//分母
		double  molecular = 1;//分子
		double fraction  = molecular/denominator;
		double sum = 0;
		//1/1,2/1,3/2,5/3,8/5,13/8,21/13
		//在前面多加1/1項,不計算進該數列,找出項之間的關係
		//後項分母=前項分子
		//後項分子=前項分子+前項分母		
		for (int i = 1; i <= line; i++) {			
			double d = molecular;
			double m = denominator;
			molecular = d+m;//後項分子=前項分子+前項分母
			denominator = d;//後項分母=前項分子
			sum +=molecular/denominator;  //求和
			System.out.println("第"+i+"項:"+molecular+"/"+denominator);
		}
		
		System.out.println("前"+line+"項的和為:"+sum);
				
	}


}</span>
執行結果:

分數累加

程式3:

<span style="font-size:14px;">package tong.yue.day2;


import java.util.Scanner;


/**
 * 求1+2!+3!+...+20!的和,本題目要求階乘累加和。
 * @author tong
 *
 */


public class FactorialSum {


	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("請輸入階乘加和的項數(<=20):");
		int line = scanner.nextInt();
		if (line<=0||line>20) {
			System.out.println("輸入資料有誤,請重新輸入階乘加和的項數(<=20):");
			line = scanner.nextInt();
		}			
		printFactorialSum(line);


	}


	private static void printFactorialSum(int line) {
		long sum = 0; //累加變數
		long temp = 1;	//累乘變數	
		for (int i = 1; i <= line ; i++) {
			//根據項數迴圈,從1!+2!+...+line!
			for (int j = 1; j <= i; j++) {
				temp *= j;				
			}
			sum += temp;
			//每次累加一次,該變數恢復為1,繼續下次累加
			temp = 1;
		}
		
		System.out.println("該階乘的累加或為:"+sum);
		
	}


}</span>
執行結果:

階乘累加