題目 算法實現,輸入一個正整數n,打印2*n行,如當輸入n=4時,輸出
1
2*3
4*5*6
7*8*9*10
7*8*9*10
4*5*6
2*3
1
個人認爲這道題的難點在於下半部分的數字記錄。在實現方面有很多種方法,其中一種方法是在一個for循環裏面分兩個小循環,一個打印上半部分,一個打印下半部分,作爲判斷條件就是當循環到第n次時,n次以前的就執行上半部分的循環,n次以後就執行下半部分的循環。
<span style="white-space:pre"> </span>for(int j = 0; j < 2*i+1; j++){
if(j != 0 && j % 2 != 0){
System.out.print("*");
}else {
System.out.print(k);
k++;
}
}
System.out.println("");
上半部分的實現,其中判斷是否輸出*時,當j爲奇數時輸出,k是作爲輸出數,每輸出一個便加1.
<span style="white-space:pre"> </span>k = k - 1;
b = k - (n - a) ;
k = b;
for(int j = 0; j < ((2*n-1)-(i-n)*2); j++){
if(j != 0 && j % 2 != 0){
System.out.print("*");
}else {
System.out.print(b);
b++;
}
}
a++;
System.out.println("");
下半部分的實現。下半部分要考慮的是輸出的位數要和上半部分相對應,且數字也要對應。其中對輸出位數的計算爲(2*n-1)-(i-n)*2,(2*n-1)是上半部分最後一行輸出的位數,然後減去一個等差得出需要輸出的位數。對於輸出數的計算,我先定義一個新的變量a,它隨着小循環結束加1。k=k-1是因爲上半部分結束時k任然加1,所以要先減去1得到上半部分輸出的最後一個數字。b = k - (n - a) 這句主要作用是得到每一行開頭的數字,方便輸出,最後k=b的作用是記錄上一行的第一個數字。
public class Algorithm {
public void test(int n){
int k = 1;//上半部分輸出大小及下半部分的記錄
int a = 1;//下半部分涉及到的算法
int b = 0;//下半部分輸出數字大小
for(int i = 0; i < 2*n; i++){
if (i < n){
for(int j = 0; j < 2*i+1; j++){
if(j != 0 && j % 2 != 0){
System.out.print("*");
}else {
System.out.print(k);
k++;
}
}
System.out.println("");
}else {
k = k - 1;
b = k - (n - a) ;
k = b;
for(int j = 0; j < ((2*n-1)-(i-n)*2); j++){
if(j != 0 && j % 2 != 0){
System.out.print("*");
}else {
System.out.print(b);
b++;
}
}
a++;
System.out.println("");
}
}
}
public static void main(String[] args){
Algorithm a = new Algorithm();
Scanner s = new Scanner(System.in);
int n = s.nextInt();
a.test(n);
}
}
完全代碼
5
1
2*3
4*5*6
7*8*9*10
11*12*13*14*15
11*12*13*14*15
7*8*9*10
4*5*6
2*3
1
當輸入5時得到的輸出。