蓝桥杯练习

L1-7. 古风排版

时间限制

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
 

 

这题一看觉得是很简单的题,就是换个二维数组存之后又输出,但是在打的过程中总是一直bug,真的弄到自己心
烦去;后来找了我舍友来看才得出结果。我想说细心真的非常重要,本来说我的解题思路已经很清晰了。但是就是
在打代码的时候可能粗心弄错了变量。导致一直会有个bug。

 

思路:根据题目的意思就是换个输出方式而已。但是要像它一样打出来的话,如果字符串的长度不够二维数组长乘宽的长度,

那么就要补上一个空格。如果刚好就不用补上了。代码实现如下:

#include<stdio.h>
#include<string.h>
int main()
{
int n;
scanf("%d\n",&n);//输入多少行 
char a[1000];//放字符串 
int i,k,s=0;//j是列 
gets(a);
for(i=0;a[i]!='\0';i++);//字符串长度 
int j;

if(i/n==0){//刚好是符合二维数组的长度 
j=j/n;
}
else j=i/n+1;

for(k=i;k<j*n;k++)//补上空格 
        {
  a[k]=' ';
}

a[k]='\0';


char b[n][j];


for(k=j-1;k>=0;k--)//从最后一列开始 
{
for(i=0;i<n;i++)//从上往下赋值 
{
b[i][k]=a[s++];
}
}

for(i=0;i<n;i++)
{
for(k=0;k<j;k++)
printf("%c",b[i][k]);
printf("\n");
}
return 0;

以后肯定要更细心点才行了,打代码的时间是有限的,在有限的时间里要打出所有题目是很难的。所以最好的

减少时间的代码就是细心不让自己原本就会的代码出错然后重新找bug.还有就是要在一种全身心投入的情况下写代码效率最高。

简单来说就是每次考试之后快结束的时候你很快的思考努力多要点题那种状态。今天收获很多。希望一起来讨论。

这个算法的复杂度是On^2;在经过我一夜的思考之后,我得出了复杂度只为On的算法,那就是不用二维数组存放了,直接输出出来,因为要输出的字符存在对应关系,就是先输出的是第(j-1)*n+0个元素,然后是(j-2)*n+0个元素,对应行的是(j-1)*n+1的元素。

#include<stdio.h>
#include<string.h>
int main()
{
int n;
scanf("%d\n",&n);//输入多少行 
char a[1000];//放字符串 
int i,k,s=0;//j是列 
gets(a);
for(i=0;a[i]!='\0';i++);//字符串长度 
int j;

if(i/n==0){//刚好是符合二维数组的长度 
j=j/n;
}
else j=i/n+1;

for(k=i;k<j*n;k++)//补上空格 
        {
  a[k]=' ';
}

a[k]='\0';

for(i=0;i<n;i++)
{
for(k=j-1;k>=0;k--)
printf("%c",a[k*n+i]);
printf("\n");
}
return 0;

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值