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.youkuaiyun.com/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;
}