L1-039 古风排版 (20分)
发布日期:2021-05-08 16:27:21 浏览次数:12 分类:精选文章

本文共 1279 字,大约阅读时间需要 4 分钟。

L1-039 古风排版 (20分)

题目

中国的古人写文字,是从右向左竖向排版的。本题就请你编写程序,把一段文字按古风排版。

输入格式:

输入在第一行给出一个正整数N(<100),是每一列的字符数。第二行给出一个长度不超过1000的非空字符串,以回车结束。

输出格式:

按古风格式排版给定的字符串,每列N个字符(除了最后一列可能不足N个)。

输入样例:

4This is a test case

输出样例:

asa Tst ihe tsi ce s

思路

坑点:

  1. 如果最后一列不足,不足的部分空格补齐;
  2. 如果字符串长度小于每一列的字符数,则不足的部分还是要用空格补齐;
  3. cin.getline()读入第二行的非空字符串的时候,最后一个样例点怎么都过不去,把这部分换成getchar莫名其妙就过了,这点真的很让人疑惑,,,希望有大佬能解答。

主要思路就是,第 i i i 行从右往左,是从 i i i 个字符开始每隔 n n n 个的字符,也就是第 i i i 行第 j j j 列的字符是原字符串第 i + j ∗ n i + j * n i+jn 个字符。如果 i + j ∗ n i + j * n i+jn 超过了原字符串的长度,用空格补齐。

代码

#include
#define INF 0x3f3f3f3f#define PI acos(-1)using namespace std;typedef pair
P;typedef long long ll;const int N = 3e5 + 19;const ll mod = 1e9 + 7;char str[N];char tmp[N];int main(){ int n; cin >> n; getchar(); int m = 0; while((str[m] = getchar()) != '\n') { m++; } int cnt = 0; int k = m / n; if(m % n) k++; for(int i = 0; i < n; i++) { int nn = i; while(nn < m) { tmp[cnt++] = str[nn]; nn += n; } for(int i = k - 1; i >= 0; i--) { if(i >= cnt) cout << ' '; else cout << tmp[i]; } cout << endl; cnt = 0; } return 0;}
上一篇:L1-040 最佳情侣身高差 (10分)
下一篇:L1-038 新世界 (5分)

发表评论

最新留言

不错!
[***.144.177.141]2025年03月24日 01时54分18秒