zoukankan      html  css  js  c++  java
  • PAT-L1古风排版 打印字符串和处理

    L1-039. 古风排版

    时间限制
    400 ms
    内存限制
    65536 kB
    代码长度限制
    8000 B
    判题程序
    Standard
    作者
    陈越

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

    输入格式:

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

    输出格式:

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

    输入样例:
    4
    This is a test case
    
    输出样例:
    asa T
    st ih
    e tsi
     ce s

    给出了n是最后排版的行数,这时候肯定要取模求出列数。找出最后排版的行数和列数,用一个数组存原串,再用一个二维存排版,最后打印就行了。

    虽然是L1但是1A还是不容易的

    注意易错点有两个:

    1.列数col要根据len(原串)%n是否有余数,如果有,列数col是要加1,一开始就忘记了刚好取模为0的,一直是默认列数+1的,这样数据就不能全过。

    2.一个字符串进行输入时,字符串的末尾是‘’,注意读入原串的时候超过长度就不能读了,否则会出现一个位置不是空格是‘’(打印出来是看不出来的)。具体可参考http://blog.csdn.net/ccutyear/article/details/68239253#,可以在for循环把str[i]当做跳出的条件或者读取到len,其他置为空格。


    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    char sub[105][105];
    char str[1005];
    int main()
    {
    //    freopen("in.txt","r",stdin);
    	int n,col;
    //	memset(sub,' ',sizeof(sub));
    	scanf("%d",&n);
    	getchar();
    	gets(str);
    	int len=strlen(str);
    	int y=len/n;// 19/4=4余3,也就是其实还余一行,下标从0开始刚好多一行
    	if(len%n != 0)
            col = y+1;
        else {
            col = y;
            y--;
        }
    	int row = n;
    	int x=0;
    	for(int i=0;i<col*row;i++)
    	{
    	    if(i<len)
                sub[x][y]=str[i];//从最右边开始
            else {
                sub[x][y] = ' ';
            }
            x++;
    		if(x>=n)
    		{
    			x%=n;
    			y--;//后退一行
    		}
    	}
    	for(int i=0;i<row;i++)
    	{
    		for(int j=0;j<col;j++)
    		{
    			printf("%c",sub[i][j]);
    		}
    		printf("
    ");
    	}
    	return 0;
    }
    

    或者之前就把sub全部置为空格,for循环读取到str末尾''就退出。这也是上面给的那个博客担心的解决方案之一。

    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    char sub[1005][1005];
    char str[1005];
    int main()
    {
    //    freopen("in.txt","r",stdin);
    	int n,col;
    	memset(sub,' ',sizeof(sub));
    	scanf("%d",&n);
    	getchar();
    	gets(str);
    	int len=strlen(str);
    	int y = len/n;
    	if(len%n != 0)
            col = y+1;
        else {
            col = y;
            y--;
        }
        int row = n;
    	int x=0;
    	for(int i=0;str[i];i++)
    	{
    		sub[x][y]=str[i];//从最右边开始
    		x++;
    		if(x>=n)
    		{
    			x%=n;
    			y--;//后退一行
    		}
    	}
    	for(int i=0;i<row;i++)
    	{
    		for(int j=0;j<col;j++)
    		{
    			printf("%c",sub[i][j]);
    		}
    		printf("
    ");
    	}
    	return 0;
    }
    


  • 相关阅读:
    动手动脑2
    假期第五周学习记录
    假期第四周学习记录
    假期第三周学习记录
    假期第二周学习记录
    执行$JAVA_HOME/bin/java -version和java -version命令输出结果不一致
    假期第一周学习记录
    使用VMware创建虚拟机并下载linux系统镜像文件
    VMware Worstation下载安装
    第十七周学习进度
  • 原文地址:https://www.cnblogs.com/zhangmingzhao/p/7256620.html
Copyright © 2011-2022 走看看