中国的古人写文字,是从右向左竖向排版的。本题就请你编写程序,把一段文字按古风排版。
输入格式:
输入在第一行给出一个正整数N(<100),是每一列的字符数。第二行给出一个长度不超过1000的非空字符串,以回车结束。
输出格式:
按古风格式排版给定的字符串,每列N个字符(除了最后一列可能不足N个)
输入样例:
4
This is a test case
输出样例:
asa T
st ih
e tsi
输入格式:
输入在第一行给出一个正整数N(<100),是每一列的字符数。第二行给出一个长度不超过1000的非空字符串,以回车结束。
输出格式:
按古风格式排版给定的字符串,每列N个字符(除了最后一列可能不足N个)
输入样例:
4
This is a test case
输出样例:
asa T
st ih
e tsi
ce s
本题难点:
1.如何寻找填充字符的规律?
可以发现,每次填充字符,在当前列不变的情况下,逐行填充,故如果外循环变量为i,内循环变量为j,则应在下标为j,i处填充,切i的上限是列数,j的上限是行数
2.如何处理字符不足的情况?
本题隐藏了一个条件,当字符不足时,用空格来补全,否则不用空格是不可能按照样例输出的。定义一个变量表示字符串下标,从0开始,当变量不小于字符串长度时,填充空格
3.如何获得列数?
一般采用一个循环,当字符串长度L加上循环变量i能被N整除时,列数等于(L+i)/N,整个操作的复杂度为O(N),但是可以用更快捷的方式获取列数,列数M=(L+N-1)/N,复杂度为O(1)
4.如何处理整数和带空格字符串的输入?
C++语言提供了getline函数来接收带字符串的空格,然而此函数只要碰到换行符便立即结束输入,C++语言可以使用标准头文件#include<cstdio>来使用函数getchar,来接收输入整数后需要输入的换行符
具体代码:
#include<iostream> #include<cstdio> using namespace std; int main() { string s; int N; cin>>N; getchar();//接收换行符 getline(cin,s); int M=(s.length()+N-1)/N,k=0; /*通过(s.length()+N-1)/N快速得到所需列数,且N=1的情况下也成立 如果是 (s.length()+N)/N,则N=1的情况下不适用,需要特殊处理 */ char c[N][M]; for(int i=M-1;i>=0;i--) for(int j=0;j<N;j++) { if(k<s.length()) c[j][i]=s[k++]; else c[j][i]=' '; } for(int i=0;i<N;i++) { for(int j=0;j<M;j++) cout<<c[i][j]; cout<<'\n'; } return 0; }