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.一个字符串进行输入时,字符串的末尾是‘\0’,注意读入原串的时候超过长度就不能读了,否则会出现一个位置不是空格是‘\0’(打印出来是看不出来的)。具体可参考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("\n"); } return 0; }
或者之前就把sub全部置为空格,for循环读取到str末尾'\0'就退出。这也是上面给的那个博客担心的解决方案之一。
#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("\n"); } return 0; }