Go core development study notes (XI) - pyramid, diamond, narcissistic number, size three rows

Because of the type of problem is a classic pyramid, opened a separate chapter dealing with regular triangle inverted triangle rhombus

  1. Case: print various types of pyramid
    package main
    
    import "fmt"
    
    func main() {
    	/*
    	需求:打印各种金字塔
    	    *
    	   * *
    	  *   *
    	 *     *
    	* * * * *
    	或者
    	    *
    	   ***
    	  *****
    	 *******
    	*********
    	或者
    	   *
    	  * *
    	 * * *
    	* * * *
    
    	需求分析:
    	应该是利用变量和数学算法打印多少个空格和几个*,
    	 */
    
    	var level int
    	fmt.Println("请输入圣诞树的层数: ")
    	fmt.Scanf("%d",&level)
    
    	//等边三角形金字塔
    	for i := 1 ; i <= level ; i++ {             //level作为传入值,由使用者决定
    		/*
    			分析下:
    			i = 1 , j = 0 , k = 1(* )
    			i = 2 , j = 1 and 0, k = 2(* )
    			i = 3 , j = 2 and 1 and 0 , k = 3(* )
    			所以就推出,层数是外循环,空格数和*数是内循环
    			根据通项公式: j循环 => j < i 即可; k循环 => k = 2i - 1
    		*/
    		for j := 1 ; j <= level - i ; j++ {
    			fmt.Print(" ")
    
    		}
    		for k := 1 ; k <= i ; k++ {
    			fmt.Print("*")
    			fmt.Print(" ")
    		}
    		fmt.Println()
    	}
    
    	//紧凑型金字塔
    	for i := 1 ; i <= level ; i++ {
    		/*
    			分析下:
    			i = 1 , j = 0 , k = 1
    			i = 2 , j = 1 and 0, k = 1 and 3
    			i = 3 , j = 2 and 1 and 0 , k = 1 and 3 and 5
    			所以就推出,层数是外循环,空格数和*数是内循环
    			根据通项公式: j循环 => j < i 即可; k循环 => k = 2i - 1
    		*/
    		for j := 1 ; j <= level - i ; j++ {
    			fmt.Print(" ")
    
    		}
    		for k := 1 ; k <= 2 * i - 1 ; k++ {
    			fmt.Print("*")
    		}
    		fmt.Println()
    	}
    	//中空金字塔
    	for i := 1 ; i <= level ; i++ {
    		/*
    		分析下:
    		在每行打印*的时候,要考虑打印*还是空格
    		中空情况就是两头打*,所以分别是 k==1 和 k== 2 * i - 1打了两个*
    		另外最后一列不能中空,所以最后一层 k == level 需要打一串*
    		else情况都是打空格
    			    *
    			   * *
    			  *   *
    			 *     *
    			*********
    		*/
    		for j := 1 ; j <= level - i ; j++ {
    			fmt.Print(" ")
    
    		}
    		for k := 1 ; k <= 2 * i - 1 ; k++ {
    			if k == 1 || k == 2 * i -1 || i == level {
    				fmt.Print("*")
    			} else {
    				fmt.Print(" ")
    			}
    		}
    		fmt.Println()
    	}
    }
    
  2. Case: Print hollow diamond
    package main
    
    import "fmt"
    
    func main() {
    	//打印空心菱形
    	var level int
    	fmt.Println("请输入的层数: ")
    	fmt.Scanf("%d",&level)
    	for i := 1 ; i <= level ; i++ {
    		/*
    		学会打印空心金字塔,就是学会打印倒三角
    		那么菱形就是金字塔和倒三角的拼接,利用两个for循环作用域三变量完成拼接
    		但是又涉及到双方有共享的一行,所以倒三角部分 level - 1
    		这时候为了图形规范性,必须在每层输出的时候多加一个空格否则会如下
    		                *
    					   * *
    					  *   *
    					 *     *
    					*       *
    			        *     *
    			         *   *
    			          * *
    			           *	
    		多加了空格之后,就变成正规菱形了。		
    					    *
    					   * *
    					  *   *
    					 *     *
    					*       *
    			         *     *
    			          *   *
    			           * *
    			            *
    		*/
    		for j := 1 ; j <= level - i ; j++ {
    			fmt.Print(" ")
    
    		}
    
    		for k := 1 ; k <= 2 * i - 1 ; k++ {
    			if k == 1 || k == 2 * i -1 {
    				fmt.Print("*")
    			} else {
    				fmt.Print(" ")
    			}
    		}
    		fmt.Println()
    	}
    
    	for i := 1 ; i <= level - 1; i++ {
    		//这就是做拼接的时候多加一个空格保证格式对齐
    		fmt.Printf(" ")                          
    		
    		for k := 1 ; k <= i - 1 ; k++ {
    			fmt.Printf(" ")
    		}
    
    		for j := 1 ; j <= 2 * (level -1 - i) + 1 ; j++ {
    			if j == 1 || j == 2 * (level - 1 - i) + 1 {
    				fmt.Printf("*")
    			} else {
    				fmt.Printf(" ")
    			}
    		}
    
    		fmt.Println()
    	}
    }
    
  3. Example: Enter a number between 1 and 999 to see is not the number of daffodils
    package main
    import "fmt"
    func main() {
    	/*
    	需求:求1~999之间所有的水仙花数
    
    	需求分析:
    	水仙花数就是三位数 xyz = x^3 + y^3 + z^3这样的有多少种
    	首先先要拆分三位数,因为是整数
    	x = xyz / 100
    	y = xyz % 100 / 10
    	 */
    	for {
    		var num int
    		var x int
    		var y int
    		var z int
    		fmt.Println("请输入一个三位数整数:")
    		fmt.Scanf("%d",&num)
    		if  num > 0 && num <= 999 {
    			x = num / 100
    			y = num % 100 / 10
    			z = num % 100 % 10
    			if num == x*x*x + y*y*y + z*z*z {
    				fmt.Printf("数字%d是水仙花数\n",num)
    			} else {
    				fmt.Printf("数字%d不是水仙花数\n",num)
    			}
    			break
    		} else {
    			fmt.Println("您输入的不是三位数整数,请重新输入")
    		}
    	}
    	fmt.Println("程序结束,感谢使用")
    }
    
  4. Example: Enter the three numbers to compare the size, in ascending order
    package main
    
    import "fmt"
    
    func main() {
    	var (
    		a int
    		b int
    		c int
    		temp int
    	)
    	fmt.Println("请输入三个数,用空格间隔开:\n")
    	fmt.Scanf("%d %d %d",&a,&b,&c)
    
    	if a > b {
    		temp = a
    		a = b
    		b = temp
    	}
    
    	if a > c {
    		temp = a
    		a = c
    		c = temp
    	}
    
    	if b > c {
    		temp = b
    		b = c
    		c = temp
    	}
    
    	fmt.Printf("三个数字的从小到大顺序为:%d %d %d",a,b,c)
    }
    
Published 50 original articles · won praise 18 · views 4018

Guess you like

Origin blog.csdn.net/weixin_41047549/article/details/89638711