1. 程式人生 > >PAT-ADVANCED1031——Hello World for U

PAT-ADVANCED1031——Hello World for U

我的PAT-ADVANCED程式碼倉:https://github.com/617076674/PAT-ADVANCED

原題連結:https://pintia.cn/problem-sets/994805342720868352/problems/994805462535356416

題目描述:

題目翻譯:

1031 U型Hello World

給定任意N(>= 5)個字元的字串,你需要將字串組成U形。例如,helloworld可以列印為:

h  d
e  l
l  r
lowo

也就是說,必須以原始順序列印字元,從左垂線開始自上而下含有n1個字元,然後沿著底線從左到右含有n2個字元,最後沿著右垂直線自下而上含有n3個字元。而且,我們希望U儘可能地成為一個正方形——也就是說,必須滿足n​1​​ = n​3 ​​= max { k | k <= n​2​​ 其中,3 <= n​2​​ <= N } 且n​1 ​​+ n​2 ​​+ n​3​​ − 2=N。

輸入格式:

每個輸入檔案包含一個測試用例。 每個測試用例包含一個不少於5個字元且不超過80個字元的字串。該字串不包含空格。

輸出格式:

對每個測試用例,列印輸入字串的U型輸出。

輸入樣例:

helloworld!

輸出樣例:

h   !
e   d
l   l
lowor

知識點:字串

思路:根據輸入字串長度計算出n1、n2和n3的值

n1 = n3 = (len + 2) / 3

n2 = (len + 2) - n1 - n3

其中len為輸入字串的長度。

時間複雜度是O(len)。空間複雜度是O(1)。

C++程式碼:

#include<iostream>
#include<cstring>

int main(){
	char input[81];
	scanf("%s", input);
	int n1 = (strlen(input) + 2) / 3;
	int n3 = n1, n2 = strlen(input) + 2 - n1 - n3, left = 0, right = strlen(input) - 1;
	for(int i = 0; i < n1 - 1; i++){
		printf("%c", input[left++]);
		for(int j = 0; j < n2 - 2; j++){
			printf(" ");
		}
		printf("%c\n", input[right--]);
	}
	for(int i = left; i <= right; i++){
		printf("%c", input[i]);
	}
	printf("\n");
	return 0;
}  

C++解題報告: