linwebs

林林.台灣 | Linwebs - 隨手記

C++三角形

寫一個程式,讀入一筆整數n,輸出n的三角形形狀。

範例輸入1:

2

範例輸出1:

ooxoo
oxxxo
xxxxx

範例輸入2:

3

範例輸出2:

oooxooo
ooxxxoo
oxxxxxo
xxxxxxx

範例輸入3:

4

範例輸出3:

ooooxoooo
oooxxxooo
ooxxxxxoo
oxxxxxxxo
xxxxxxxxx

Solution 1 [簡易] (設兩個變數分別儲存o和x每行要輸出的數量): 

/* Programming By Linwebs */
#include<iostream>	// 引入 C++ 標頭檔
using namespace std;	// 使用 std 名稱空間
int main() {	// C++ 主程式
	int n, o, x;
	// n 儲存三角形的大小
	// o 儲存當前每一行左側和右側的 'o' 要顯示的數量
	// x 儲存當前每一行中間的 'x' 要顯示的數量

	cin >> n;	// 首先輸入 n 設定三角形的大小
	// 先設定第一行 'o' 和 'x' 的數量
	o = n;	// 第一行 'o' 左側和右側的數量跟 n 一樣
	x = 1;	// 第一行 'x' 的數量為 1 個
	for(int i=0; i<=n; i++) {
		// 要輸出 n+1 行,所以要執行 n+1 次
		for(int j=0; j<o; j++) {
			// 輸出左側 o 個 'o'
			cout << "o";
		}
		for(int j=0; j<x; j++) {
			// 輸出中間 x 個 'x'
			cout << "x";
		}
		for(int j=0; j<o; j++) {
			// 輸出右側 o 個 'o'
			cout << "o";
		}
		// 每輸出完一行後,就將 o 和 x 數量調整為下一行的數量
		// o 的數量每輸出完一行,左側和右側各會減少 1 個,故將 o 的數量設為 o 當前的數量再減 1
		o--;
		// x 的數量每輸出完一行,會增加兩個,故將 x 的數量設為 x 當前的數量再加 2
		x += 2;
		// 每輸出完一行就須換行
		cout << endl;
	}
	return 0;	// 程式執行完畢,回傳 0
}

Solution 2純解法 [進階] (只用 n 判斷要輸出o或x): 

/* Programming By Linwebs */
#include<iostream>
using namespace std;
int main() {
	int n;
	cin >> n;
	for(int i=0; i<=n; i++) {
		for(int j=0; j<(n*2+1); j++) {
			if(j < (n-i) || j > (n-i+i*2))
				cout << "o";
			else
				cout << "x";
		}
		cout << endl;
	}
	return 0;
}

Solution 2加入註解 [進階] (只用 n 判斷要輸出o或x): 

/* Programming By Linwebs */
#include<iostream>	// 引入 C++ 標頭檔
using namespace std;	// 使用 std 名稱空間
int main() {	// C++ 主程式
	int n;	// n 儲存三角形的大小
	cin >> n;	// 首先輸入 n 設定三角形的大小
	for(int i=0; i<=n; i++) {	// 要顯示 n+1 行,所以要執行 n+1 次
		for(int j=0; j<(n*2+1); j++) {	// 每行要顯示 2 倍的 n 加 1 個字元
	 	 	 /* 左側要輸出 'o' 的數量為 n-i-1 個,也就是三角形的大小減去當前行數,故要輸出的情況為 j < (n-i) 時
	 	 	  * 中間 'x'的數量為 (i*2+1) 個,故要輸出的情況為左側數量 j >= (n-i) 且 j <= ( (n-i) + (i*2) ) 時
	 	 	  * 右側的數量與左側相同,判斷方式為輸出完左側與中間後才執行,故要輸出右側 'o' 的情況為 j > ( (n-i) + (i*2) ) 時
	 	 	  */
			if(j < (n-i) || j > (n-i+i*2))	// 判斷當下要輸出的字元 j 是位於左側中間或右側
				cout << "o";	// 當輸出的字元為左側或右側時,輸出 'o'
			else
				cout << "x";	// 否則就輸出 'x'
		}
		cout << endl;	// 每輸出完一行就須換行
	}
	return 0;	// 程式執行完畢,回傳 0
}


題目來源:國立嘉義大學資訊工程學系廖祐德

建立時間:2018/10/27 PM 1:21
作者: Linwebs

bookmark熱門隨手記標籤