浙大 PAT 甲级 1031 Hello World for U 排版题总结

和1001题类似,它们都属于排版题。排版题不再把注意力放到处理输入的数据当中,而对输出作特别的关注。(《王道论坛机试指南》)针对这些题目,掌握C的printf/scanf,C++的cin/cout至关重要,记清楚对格式的控制。根据目前为止所做的PAT题目,总结了几个常用的小技巧:

  • printf("%03d",ans)  %后加上03代表用0将输出(左边)填充为三位数,016代表左零填充为16位数,以此类推。在有些固定的数据,比如固定7位的学号,都是数字,用字符数组显得麻烦,所以经常直接用int来存储学号。但是有些学号是以0开头的,如果直接输出则会出错。这一点在PAT题目里出现过很多次。
  • printf("%.3f",ans)  %后加上.3f代表输出为小数点后保留3位的浮点数,这里是截断,不是四舍五入。
  • 开辟字符型数组时永远多开辟几个单元,因为如果后面没有地方存储0时,直接用printf("%s",ans)会不知道在何处截止,后面会输出很多无关的多余乱码。
  • 如果要读取一整行含空格的字符串,使用cin.getline。或者string.getline(...).
  • cin、cin.getline等使用时要查清楚对于空格、换行符的处理,这里涉及到缓冲区等问题,很容易出错,需要进行细致的了解。网上有很多讲解,可以系统地学习一下。
  • C语言中的strtok函数可以用于分割字符串,具体用法请查函数原型。

以上是针对算法题中的输入输出控制的一些知识点的提纲,后续会做更多补充。

解决排版题也有两种思路:

  • 较强规律性的输出。例如用字符*输出一个高度为h,上底边为h,直角边在左侧的直角梯形。这类题直接输出即可。
  • 无较强规律性。例如本题,那么考虑使用一个多维字符型数组来存储中间过程,最后再一起输出。

下面是1031题的代码:

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

char output[30][30];

int main()
{
    // init
    for (int i = 0; i < 30; i++)
    {
        for (int j = 0; j < 30; j++)
        {
            output[i][j] = ' ';
        }
    }
    char input[81];
    scanf("%s", input);
    int n1, n2, n3;
    n1 = (strlen(input) + 2) / 3;
    n3 = (strlen(input) + 2) / 3;
    n2 = strlen(input) + 2 - n1 - n3;
    for (int i = 0; i < n1; i++)
    {
        output[i][0] = input[i];
    }
    for (int i = 0; i < n2; i++)
    {
        output[n1 - 1][i] = input[n1 - 1 + i];
    }
    for (int i = 0; i < n3; i++)
    {
        output[i][n2 - 1] = input[strlen(input) - i - 1];
    }
    for (int i = 0; i < n1; i++)
    {
        for (int j = 0; j < n2; j++)
        {
            printf("%c", output[i][j]);
        }
        printf("\n");
    }
    return 0;
}

 

上一篇:oppo安卓面试题,Jetpack-MVVM高频提问和解答,面试必会


下一篇:PAT(乙级)1031 查验身份证 (15 分)