PTAL1-039 古风排版(20 分)难点剖析

中国的古人写文字,是从右向左竖向排版的。本题就请你编写程序,把一段文字按古风排版。
输入格式:
输入在第一行给出一个正整数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;
}

猜你喜欢

转载自blog.csdn.net/qq_37729102/article/details/80718977