pta系列之古风排版

本文介绍了如何使用C语言实现一个将输入字符串按照古风排版方式填充到二维字符数组的问题,包括读取输入、计算列数、创建数组、填充字符和输出结果的过程。
摘要由CSDN通过智能技术生成

9efbcbc3d25747719da38c01b3fa9b4f.gif

 c语言中的小小白-CSDN博客c语言中的小小白关注算法,c++,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm=1001.2014.3001.5343

给大家分享一句我很喜欢我话:

知不足而奋进,望远山而前行!!!

铁铁们,成功的路上必然是孤独且艰难的,但是我们不可以放弃,远山就在前方,但我们能力仍然不足,所有我们更要奋进前行!!!

今天我们更新了古风排版内容,

🎉 欢迎大家关注🔍点赞👍收藏⭐️留言📝

一、题目描述:

二、思路解析:

这个题的思路大概就是,我们得到有几行之后,输入字符串之后,需要知道一共需要几列,然后算出一共几列,然后记录一下,然后按题目中的情况去存入字符数组,注意,这里我们是要用二维数组,不明白二维数组的,可以去前面看一下这篇文章,关于C语言数组的认识(1)-CSDN博客

我在这篇文章中讲述了二维数组,然后逐步存入之后,我们就可以输出了。

这道题目的主要思路可以分为以下几个步骤:

  1. 读取输入:首先读取输入的正整数N,表示每一列的字符数,以及字符串。

  2. 确定列数:根据输入的字符串长度和N,可以计算出总共需要多少列。这里需要注意的是,最后一列可能不足N个字符。

  3. 创建二维数组:创建一个二维字符数组,大小为[N][列数],用来存储排版后的字符串。

  4. 从右向左填充字符:从输入的字符串末尾开始,从右向左逐个取字符,并按照古风排版的方式填入二维数组中。古风排版是从右向左竖向排版的,所以在二维数组中每一列上的字符应该是原字符串从右向左取得的。

  5. 输出结果:最后遍历二维数组,按照每列输出N个字符的方式输出排版后的字符串。

这个算法的关键在于如何将输入的字符串按照古风排版的方式填入二维数组中,然后再按照要求输出即可。这里的代码示例中已经包含了这个过程的实现。

三、代码实现:

C++版本:

#include<iostream>
#include<string>
using namespace std;

int main()
{
    int n = 0; cin >> n;
    cin.ignore();

    string str;
    getline(cin, str);

    int len = str.length();
    int col = len / n;
    if (len % n != 0)
    {
        col++;
    }
    char arr[100][100] = { 0 };
    int index = 0;
    for (int i = col - 1; i >= 0; i--)
    {
        for (int j = 0; j < n; j++)
        {
            if (index < len)
            {
                arr[j][i] = str[index++];
            }
            else arr[j][i] = ' ';
        }
    }
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < col; j++)
        {
            cout << arr[i][j];
        }
        cout << endl;
    }


    return 0;}
#include<iostream>
#include<string>
using namespace std;

int main()
{
    int n = 0; cin >> n;
    cin.ignore();

    string str;
    getline(cin, str);

    int len = str.length();
    int col = len / n;
    if (len % n != 0)
    {
        col++;
    }
    char arr[100][100] = { 0 };
    int index = 0;
    for (int i = col - 1; i >= 0; i--)
    {
        for (int j = 0; j < n; j++)
        {
            if (index < len)
            {
                arr[j][i] = str[index++];
            }
            else arr[j][i] = ' ';
        }
    }
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < col; j++)
        {
            cout << arr[i][j];
        }
        cout << endl;
    }


    return 0;}

C语言版本:

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

int main() {
    int n = 0;
    scanf("%d", &n);
    getchar(); // 消耗掉输入缓冲区中的换行符

    char str[1001];
    fgets(str, sizeof(str), stdin);
    str[strcspn(str, "\n")] = '\0'; // 移除fgets读入的换行符

    int len = strlen(str);
    int col = len / n;
    if (len % n != 0) {
        col++;
    }

    char arr[100][100] = {0};
    int index = 0;
    for (int i = col - 1; i >= 0; i--) {
        for (int j = 0; j < n; j++) {
            if (index < len) {
                arr[j][i] = str[index++];
            } else {
                arr[j][i] = ' ';
            }
        }
    }

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < col; j++) {
            printf("%c", arr[i][j]);
        }
        printf("\n");
    }

    return 0;
}#include <stdio.h>
#include <string.h>

int main() {
    int n = 0;
    scanf("%d", &n);
    getchar(); // 消耗掉输入缓冲区中的换行符

    char str[1001];
    fgets(str, sizeof(str), stdin);
    str[strcspn(str, "\n")] = '\0'; // 移除fgets读入的换行符

    int len = strlen(str);
    int col = len / n;
    if (len % n != 0) {
        col++;
    }

    char arr[100][100] = {0};
    int index = 0;
    for (int i = col - 1; i >= 0; i--) {
        for (int j = 0; j < n; j++) {
            if (index < len) {
                arr[j][i] = str[index++];
            } else {
                arr[j][i] = ' ';
            }
        }
    }

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < col; j++) {
            printf("%c", arr[i][j]);
        }
        printf("\n");
    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值