JAVA基礎程式設計50題(19-21題)詳解
阿新 • • 發佈:2019-02-13
一、描述
題目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>
執行結果: