题目 算法实现,输入一个正整数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时得到的输出。