1. 程式人生 > 其它 >C語言 codeup2506 問題 D: 沙漏圖形 tri2str [1*+] mw的解題思路與優化方案

C語言 codeup2506 問題 D: 沙漏圖形 tri2str [1*+] mw的解題思路與優化方案

技術標籤:mw的刷題之路c語言演算法

文章目錄

題目

問題:輸入n,輸出正倒n層星號三角形。首行頂格,星號間有一空格,效果見樣例

輸入樣例:

3

輸出樣例

大概就是這個樣子
資料規模 1<= n <=50
大概就是這個樣子,具體看這→原題

解題思路

這道題其實就是在原有的對稱沙漏的基礎上右邊要輸出空格對齊。我原本想著是全部放在一個大迴圈裡面實現,可是到中間後面幾行時思考的太複雜。所以我選擇上面到中間分為一部分一起輸出,下面的分為另一部分進行輸出。

先講上面到中間的這一部分。我先考慮的是最中間只輸出一個 “ * ” 的這一部分,因為它的右邊是沒有空格的,左邊的空格規律是n-1個,最後再輸出一個 " * "。

再講上面的部分,發現左邊空格數量依次加一,中間星的數量依次減一,最後當i>0的時候右邊要輸出i個空格。

下面的部分其實就是上面的部分倒過來輸出,具體可以看程式碼,這裡比較簡單不再贅述了。

總體程式碼

#include<stdio.h>
int main(){
	int n;
	while(scanf("%d",&n)!=EOF){
		for(int i=0;i<n;i++){
			if(i==n-1){
				for(int j=0;j<n-1;j++){
					printf(" ");
				}
				printf
("*\n"); continue; } else { for(int j=0;j<i;j++){ printf(" "); } for(int k=0;k<n-i;k++){ printf("*"); if(k<n-i-1) printf(" "); } if (i>0){ for(int l=0;l<i;l++){ printf(" "); } }
printf("\n"); } } for(int i=0;i<n-1;i++){ for(int j=0;j<n-2-i;j++){ printf(" "); } for(int k=0;k<2+i;k++){ printf("*"); if(k<2+i-1) printf(" "); } if(i<n-2){ for(int l=0;l<n-2-i;l++){ printf(" "); } } printf("\n"); } } return 0; }

謝謝觀看!