中國的古人寫文字,是從右向左豎向排版的。本題就請你編寫程序,把一段文字按古風排版。
輸入格式:
輸入在第一行給出一個正整數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汁,爲了更美好的未來呢~~~