1 タイトル: 次の規則を満たす任意の行数のグラフィックスを印刷できるプログラムを作成してください。入力は、グラフィックスの行数を表す int パラメーターであり、行数は 3 より大きい奇数です。
2 問題を解決するためのアイデア:
アイデア 1: グラフを 2 つの部分に分割し、上部をサイクル、下部をサイクルにして、それぞれ「 」と「*」を出力しますが、この方法では効率が低すぎます。
アイデア 2: グラフを 2 つの部分に分割し、上部をサイクルとして使用してそれぞれ " " と * を出力し、前の (行数 - 1/2) の出力内容をスタックに格納し、次にスタック内のコンテンツを出力します。これは非常に効率的です。入力値が 101 の場合、印刷時間はわずか 5ms ですが、アイデア 1 を使用すると 2851ms かかります。
3 Java コード
import java.util.*;
/*
用栈实现
*/
public class PrintChartOne {
public static void main(String[] args){
System.out.println("请输入字符串=? ");
Scanner input=new Scanner(System.in);
int lineNumber=input.nextInt();
long startTime = System.currentTimeMillis();//获取当前时间
PrintChartOne printChartOne=new PrintChartOne();
printChartOne.printPentagram(lineNumber);
long endTime = System.currentTimeMillis();
System.out.println("程序运行时间:"+(endTime-startTime)+"ms");
}
public void printPentagram(int lineNumber){
if ((lineNumber>3) &&(lineNumber%2==1) ) {
String sStar = "*";
String sBlank = " ";//空格
//字符串栈
Stack sPrintStackS = new Stack();
for (int i = 1; i <= (lineNumber - 1) / 2 + 1; i++) {
String sPrintStar = "";//用来打印每行的"*"
String sPrintBlank = "";//用来打印每行的" "
//前i 每行*的数量
int sStarNumber = 2 * i - 1;
for (int j = 1; j <= sStarNumber; j++) {
sPrintStar = sPrintStar + sStar;
}
//前i 每行" "的数量
int sLeftBlankNumber = (lineNumber - sStarNumber) / 2;
for (int k = 1; k <= sLeftBlankNumber; k++) {
sPrintBlank = sPrintBlank + sBlank;
}
//打印前(lineNumber-1)/2+1行
String sPrint = sPrintBlank + sPrintStar;
System.out.println(sPrint);
//前i-1行内容写入栈
if (i <= (lineNumber - 1) / 2) {
sPrintStackS.push(sPrint);
}
}
//打印后(lineNumber-1)/2行
while (!sPrintStackS.empty()) {
System.out.println(sPrintStackS.pop());
}
} else System.out.println("请输入大于3的奇数!");
}
}
4 実行結果