L1-039 古风排版(PTA)

L1-039 古风排版

题目描述

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

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

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

输入样例:

4
This is a test case

输出样例:

asa T
st ih
e tsi
 ce s

代码

#include<bits/stdc++.h> // 包含STL库,此写法通常只用于竞赛编程
using namespace std;

int main() {
    int n; // 定义n,每列的字符数
    cin >> n; // 从标准输入读取每列的字符数
    cin.ignore(); // 忽略输入中的换行符
    string a; // 定义字符串a,用于存储输入的文本
    string b[100]; // 定义字符串数组b,用于存储每列的文本
    getline(cin, a); // 从标准输入读取整行文本
    int i, j; // 定义循环变量i, j
    int flag = 0; // 定义补空白字符的标志
    for (i = 0; ; i++) { // 无限循环,计算需要多少列
        if (n * i >= a.size()) { // 如果列数乘以每列字符数大于等于文本长度
            flag = n * i - a.size(); // 计算最后一列需要补多少空格
            break; // 跳出循环
        }
    }
    for (i = 0; i < a.size(); i++) { // 遍历文本中的每个字符
        int t = i % n; // 计算当前字符应放在哪一列
        b[t] += a[i]; // 将字符添加到对应的列
        if (i == a.size() - 1) { // 如果是文本的最后一个字符
            if (flag > 0) { // 如果需要补空格
                while (flag != 0) { // 补足空格
                    b[n - flag] += ' '; // 在对应的列添加空格
                    flag--; // 空格补足标志减一
                }
            }
        }
    }
    for (i = 0; i < n; i++) { // 遍历每一列
        reverse(b[i].begin(), b[i].end()); // 将每列的字符串反转,因为古文是从下到上的
        cout << b[i] << endl; // 输出每一列的字符串
    }
    return 0; // 程序结束
}

这段代码的主要逻辑是:

  1. 读取每列的字符数 n 和待排版的字符串 a。
  2. 通过一个无限循环,计算出总共需要多少列,并确定最后一列是否需要补空格。
  3. 遍历字符串 a 中的每个字符,将每个字符放入其应位于的列 b[t]。
  4. 如果是最后一个字符,并且需要补空格,则在对应的列补充空白字符。
  5. 最后,对每一列的字符串进行反转,因为古风排版是从下到上的,然后将每一列按顺序输出。
  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

命运从未公平

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值