首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

PAT 1031 Hello World for U:構造 U 字形輸出字符串

     編輯:C++ 入門

問題描述

給定長度 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]。

AC 代碼 (C)

#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

匹配樣例輸出。

關鍵點總結

  1. 推導 n1, n2 公式是核心,整除自動取滿足條件的最大 k。
  2. 輸出格式:每行末尾無多餘空格,最後一行換行。
  3. 字符串無空白,scanf("%s") 直接讀取。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved