L1-039 古風排版

中國的古人寫文字,是從右向左豎向排版的。本題就請你編寫程序,把一段文字按古風排版。

輸入格式:

輸入在第一行給出一個正整數N(<100),是每一列的字符數。第二行給出一個長度不超過1000的非空字符串,以回車結束。

輸出格式:

按古風格式排版給定的字符串,每列N個字符(除了最後一列可能不足N個)。

輸入樣例:

4
This is a test case

輸出樣例:

asa T
st ih
e tsi
 ce s

 Note:先給出我第一次寫的代碼,有幾個用例沒有通過。首先就是採取各種措施去處理不足的位置,其實完全沒有任何必要,把不足的補上空格就行了,這是要轉換思路不要死腦筋;然後就是輸出的時候,受到前面想法的制約,也是一直在卡着的。我第一次做的想法,就是順序每四個字符的存進二維數組,然後逆序輸出。想法是可以的,關鍵就是補全空格那裏一直沒想到,唉可惜了,感興趣的同學可以手動做一下啦,動動手呀動動腳呀請做深呼吸~~~

#include <stdio.h>
#include <string.h>

int main()
{
    int group[250][5];                      // 最多隻有250組,每一組字符串長度4
    int n, i, j, alloc = 0, count = 0;
    char s[101];
    scanf("%d", &n);
    getchar();                              // 過濾回車
    gets(s);

    for (i = 0; s[i] != '\0'; i++) {
        group[alloc][count] = s[i];         // 將字符逐個分配給每一組
        count ++;                           // 計數加1,同時代表每一組字符輸入的下標位置加1
        if (count == n) {
            group[alloc][count] = '\0';
            if (s[i + 1] != '\0') alloc ++;
            count = 0;
        }
    }
    if (i % n != 0) group[alloc][count] = '\0';

    // printf("alloc:%d\n", alloc);
    for (j = 0; j < n; j++) {               // j 表示每一次循環輸出的每一組的下標
        for (i = alloc; i >= 0; i--)
            printf("%c", group[i][j]);
        printf("\n");
    }
    return 0;
}

 修改後通過的代碼:測試的用例是不全面的,當我把 - len%N 去掉,仍然能得到滿分,但實際上要想真正滿足題意是不能去掉的。數組的長度也是一個考察點,有一個隱含的坑就是,當 N = 99 時,剛好只多出來十個字符,這十個字符單獨佔一列,需要補全的空格就有89個,因此數組長度至少爲1089。那個規律式可以這麼理解,從最後一個元素開始,每次往前 N 個位置即到每一列的頭部,然後加個 i 即往後挪,即爲逐個又輸出頭部後的元素。

#include <stdio.h>
#include <string.h>

int main()
{
    int n, i, j, temp;                      // temp 變量保存着字符串的長度
    char s[1100] = {0};                     // 初始化字符串
    scanf("%d", &n);
    getchar();                              // 過濾回車,C++ 中用 getline 函數即可

    gets(s);
    int length = strlen(s);                 // 得到字符串的長度
    temp = length;
    if (length%n != 0)                      // 最後一列不足 N 個字符
        for (i = 0; i < n - length%n; i++)
            s[temp ++] = ' ';               // 補全餘數個空格,同時記得這裏 temp 的值增到 N 的整數倍了

    for (i = 0; i < n; i++) {               // 以 N 爲上限實際上就是輸出 N 行
        for (j = temp/n - 1; j >= 0; j--)   // temp/n - 1 是最後一個字符的下標
            printf("%c", s[j*n + i]);       // 這是每隔 N 輸出一次的規律式,感興趣自己去推一下
        printf("\n");                       // 輸完一行就換行
    }
    return 0;
}

自己試着不要看把代碼碼出來哦,測試樣例可以直接複製,加油小fo汁,爲了更美好的未來呢~~~ 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章