Go語言小白入門刷題打印輸出沙漏

題解

【PTA團體程序設計天梯賽】 L1-002 打印沙漏 (20 分) Go語言|Golang

本題要求你寫個程序把給定的符號打印成沙漏的形狀。例如給定17個“*”,要求按下列格式打印

*****
 ***
  *
 ***
*****

所謂“沙漏形狀”,是指每行輸出奇數個符號;各行符號中心對齊;相鄰兩行符號數差2;符號數先從大到小順序遞減到1,再從小到大順序遞增;首尾符號數相等。

給定任意N個符號,不一定能正好組成一個沙漏。要求打印出的沙漏能用掉盡可能多的符號。

輸入格式:

輸入在一行給出1個正整數N(≤1000)和一個符號,中間以空格分隔。

輸出格式:

首先打印出由給定符號組成的最大的沙漏形狀,最後在一行中輸出剩下沒用掉的符號數。

輸入樣例:

19 *

結尾無空行

輸出樣例:

*****
 ***
  *
 ***
*****
2

結尾無空行

思路

基礎的輸出,如果覺得這題不友好的可以跳過,等回頭再來做做,領悟一下。

就是找規律,先計算出所需要的有多少。再減去然後得到剩餘的數量。然後再按照規律打印這個沙漏,其實就是一個等差數列瞭啦~

代碼如下

package main
import (
	"fmt"
)
func  main() {
	var n int
	var tag byte
	var sum, nextSum int
	_, _ = fmt.Scanf("%d %c", &n, &tag)
	sum = 1
	nextSum = 1
	i := 1
	last := 0
	for true { // 先是計算出所需要多少的符號
		i += 2
		nextSum += i * 2
		if nextSum <= n {
			sum += i * 2
		} else {
			i -= 2
			last = n - sum
			break
		}
	}
	for j:=i; j>=1; j=j-2 {  // 先打印上半部分
		var space = (i - j) / 2
		for k:=0; k<i-space; k++ {
			if k < space {
				fmt.Printf(" ")  // 先打印空格
			} else {
				fmt.Printf("%c", tag)  //再打印*
			}
		}
		fmt.Println() // 最後記得要換行
	}
	for j:=3; j<=i; j=j+2 {
		var space = (i - j) / 2  //再打印下半部分
		for k:=0; k<i-space; k++ {
			if k < space{
				fmt.Printf(" ")  //再打印*
			} else {
				fmt.Printf("%c", tag)
			}
		}
		fmt.Println()
	}
	fmt.Println(last)
}

以上就是Go語言小白入門刷題打印輸出沙漏的詳細內容,更多關於Go語言打印沙漏的資料請關註WalkonNet其它相關文章!

推薦閱讀: