給定長度 N (5≤N≤80) 的字符串,將其按 U 字形輸出:左竖線從上到下 n1 字符,底橫線從左到右 n2 字符,右竖線從下到上 n3 字符。要求 n1=n3=max{k | k≤n2 且 n1+n2+n3-2=N},使 U 盡可能「方正」。
總字符數:n1 + n2 + n3 - 2 = N (兩個角各算一次)。設 n1=n3=k,則 2k + n2 - 2 = N → n2 = N + 2 - 2k。
條件 k ≤ n2 ⇒ k ≤ N + 2 - 2k ⇒ 3k ≤ N + 2 ⇒ k = floor((N+2)/3)。
因此:n1 = n3 = (N+2)/3 (整除),n2 = N + 2 - 2*n1。
n1-1 行:每行輸出左字符 s[i],中間 n2-2 個空格,右字符 s[N-1-i]。n1 行(底線):連續輸出 n2 個字符 s[n1-1] ... s[n1+n2-2]。#include#include int main() { char s[81]; while (scanf("%s", s) != EOF) { int len = strlen(s); int n1 = (len + 2) / 3; int n2 = len + 2 - 2 * n1; for (int i = 0; i < n1 - 1; i++) { printf("%c", s[i]); for (int j = 0; j < n2 - 2; j++) printf(" "); printf("%c\n", s[len - 1 - i]); } for (int i = n1 - 1; i < n1 + n2 - 1; i++) printf("%c", s[i]); printf("\n"); } return 0; }
輸入 helloworld! (len=11) → n1=4, n2=5:
h ! e d l l lowor
匹配樣例輸出。
n1, n2 公式是核心,整除自動取滿足條件的最大 k。scanf("%s") 直接讀取。