当前位置:编程学习 > JAVA >>

求高手讲解下这种题的思路和方法

  *
  ***
  *****
 *******
********* 像这种题目 我遇到很多,可是一点思路都没有,不知道该怎么上手,只是知道用for循环和if语句,知道他的运行顺序,但是不知道为什么要这么写?求哪位大神好心给我讲解下。谢谢 --------------------编程问答-------------------- lz这种题目用for循环就可以完成,首先要知道它的规律,每行之间的区别,就比如第一行有四个空格,第二行有三个空格,所以可以用以一递增的函数;第一行有一个星星,第二行有三个星星,以三递增的函数;找到规律了,才能用程序写出来,下面是一个程序和结果:

public class King {
public static void main(String argc[]) {
int t;
java.util.Scanner san = new java.util.Scanner(System.in);
System.out.print("请输入行数: ");
t = san.nextInt();
for (int i = 1; i <= t; i++) {
for (int f = 1; f <= (t - i); f++)
System.out.print(" ");
for (int ff = 1; ff <= (2 * i - 1); ff++)
System.out.print("*");
System.out.println();
}
}
}


请输入行数: 5
    *
   ***
  *****
 *******
*********
--------------------编程问答-------------------- 写错了,应该是以二递增的函数 --------------------编程问答--------------------
引用 楼主 ktsorry 的回复:


给你看看我之前写的一个例子,里面注释还挺详细的!楼主加油

控制wholeCnt和leftCnt的值,能打印出不同的效果:-------
leftCnt = wholeCnt
0000*
000**
00***
0****
0****
00***
000**
0000*

leftCnt = 0
*0000
**000
***00
****0
*****
*****
****0
***00
**000
*0000

leftCnt = wholeCnt / 2
00*00
0***0
*****
*****
0***0
00*00


public class DrawGraph {
    public static final char SRC_CONTANT_CH = '0';
    public static final char OBJ_CONTANT_CH = '*';
    public static void main(String[] args) {
        int wholeCnt = 5;         // 每行的字符数
        int leftCnt = 2;          // 第一行从左边第几个开始画
        printWhole(wholeCnt, leftCnt);
    }
    
    /**
     * Description: 打印全部<br> 
     * 打印图形的重点在于,控制填充字符的begin和end,然后有规律地增加和减少
     */
public static void printWhole(int wholeCnt, int leftCnt) {
// 保证leftCnt和wholeCnt的准确性
        if (leftCnt < 0 || leftCnt > wholeCnt) { return; }
        
        int begin = 0;
        int end = wholeCnt;
        // 打印上半部分
        for(int i = 0; i < wholeCnt; i++) {
            begin = leftCnt - i;      // begin从leftCnt开始,往前填充
            end = leftCnt + i + 1;    // end从leftCnt开始,往后填充
            printOneLine(wholeCnt, begin, end);
            // 当填充满一行的时候,退出
            if (begin <= 0 && end >= wholeCnt) {  break; }
        }
        // 打印下半部分,从原来的begin和end逐个递减就可以了
        for(;;begin++,end--) {
            printOneLine(wholeCnt, begin, end);
            // 当填充满一行的时候,退出
            if (begin == leftCnt) {  break;  }
        }
    }
    
    /**
     * Description: 打印一行<br> 
     */
    public static void printOneLine(int n, int begin, int end) {
        if (begin <= end) {
            // 前端/后端的范围校验
            if (begin < 0) { begin = 0; }
            if (end > n) { end = n; }
            
            // 通过数组填充来实现拼接      
            char[] chs = new char[n];         
            Arrays.fill(chs, SRC_CONTANT_CH);
            Arrays.fill(chs, begin, end, OBJ_CONTANT_CH);
            System.out.println(chs);
        }
}
}

--------------------编程问答-------------------- 【*】占位太小了,和【0】不协调,哈哈 --------------------编程问答--------------------

public class Test3 {

public static void main(String[] args) {
printXX(5);
}

private static void printXX(int line) {
for(int i=1;i<=line;i++){
for(int j=1;j<=line-i;j++){
System.out.print(" ");
}
for(int k=1;k<=2*i-1;k++){
System.out.print("*");
}
System.out.println();
}
}

}

--------------------编程问答-------------------- 干嘛一定要在一个方法体内完成呢?为什么不写一个print(int num, String info)方法(处理把info打印num次) 我是下面那样写的,你自己弄个main方法就可以运行了

class  OutPutStyle {
/*我是菜鸟*/
public OutPutStyle(){
}
/*****
*三角形
*
***/
public  void printSJX(int lineN){
for(int i=1;i<=lineN;i++){
print(lineN-i," ");
print(i,"* ");
System.out.println();
}
}
/*****
*菱形
*
***/
public  void printLX(int lineN){
int centerN=lineN/2 +1;
printSJX(centerN);
for(int i=1;i<=centerN;i++){
print(i," ");
print(centerN-i,"* ");
System.out.println();
}
}
/*****
*
*矩形
***/
public  void printJX(int rowN,int lineN){
for(int i=1;i<=rowN;i++){
print(lineN,"* ");
System.out.println();
}
}
/*****
*
*
***/
private  void print(int num, String info){
for(int i=0;i<num;i++){
System.out.print(info);
}
}
}

--------------------编程问答-------------------- 怎么都变成注释了??我晕~~ --------------------编程问答-------------------- 楼主要的是思路,, 骚年们, 你们都直接给上代码鸟~~
我来说一下思路吧:

第一: 你要晓得,这个东西每一行其实就是空格(" ")和("*")的组合
第二: 晓得第一点就简单了, 你就用数学算出每一行究竟该出现几个空格的通用公式,
      算出每一行究竟该出现几个"*"的通用公式。
第三: 在程序里循环打印每一行的时候,把你算出来的空格和"*"的通用公式,放进循环里面就可以了,
      要注意的就是,注意控制好换行。 --------------------编程问答--------------------
引用 楼主 ktsorry 的回复:
*
 ***
  *****
 *******
********* 像这种题目 我遇到很多,可是一点思路都没有,不知道该怎么上手,只是知道用for循环和if语句,知道他的运行顺序,但是不知道为什么要这么写?求哪位大神好心给我讲解下。谢谢

java50题,很经典的,你做完了之后这种题肯定没问题的。 --------------------编程问答--------------------
引用 8 楼 AndyXuq 的回复:
楼主要的是思路,, 骚年们, 你们都直接给上代码鸟~~
我来说一下思路吧:

第一: 你要晓得,这个东西每一行其实就是空格(" ")和("*")的组合
第二: 晓得第一点就简单了, 你就用数学算出每一行究竟该出现几个空格的通用公式,
      算出每一行究竟该出现几个"*"的通用公式。
第三: 在程序里循环打印每一行的时候,把你算出来的空格和"*"的通用公式……


+
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,