本文主要是介绍c 语言基础题目:L1-039 古风排版,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
中国的古人写文字,是从右向左竖向排版的。本题就请你编写程序,把一段文字按古风排版。
输入格式:
输入在第一行给出一个正整数N(<100),是每一列的字符数。第二行给出一个长度不超过1000的非空字符串,以回车结束。
输出格式:
按古风格式排版给定的字符串,每列N个字符(除了最后一列可能不足N个)。
输入样例:
4
This is a test case
输出样例:
asa T
st ih
e tsice s
程序源码:
// 这一行用于关闭某些C运行时库的安全警告。
#define _CRT_SECURE_NO_WARNINGS // 包含标准输入输出库,本程序使用到的printf和scanf函数均来源于此库
#include <stdio.h> // 定义主函数,C语言程序的入口
int main() { // 定义一个字符数组,用于存储用户输入的字符串 char buf[1001]; // 定义一个整型变量,用于接收用户输入的整数N int N; // 使用scanf函数从标准输入读取一个整数并存储到N变量中 scanf("%d", &N); // 使用gets函数(这个函数在最新的C标准中已被废弃,建议使用fgets代替)从标准输入读取一行字符串并存储到buf数组中 // 注意,这里没有任何输入过滤和错误处理,如果输入的字符串超过了buf的大小(1001),那么就可能导致缓冲区溢出,这是一个潜在的安全隐患 gets(buf); // 再使用gets函数读取一次字符串,同样存在安全问题,且这部分代码实际上并未被使用,可以删除 gets(buf); // 使用strlen函数计算字符串的长度 int len = strlen(buf); // 计算N行的总行数,算法为len除以N,如果len除以N有余数,则总行数加1 int line = len/N+(len%N!=0?1:0); // 外层循环,控制行数,从0到N-1 for (int i = 0; i < N; i++) { // 内层循环,控制每行的字符数,从0到line-1 for (int j = 0; j < line; j++) { // 判断如果((line - j - 1) * N) + i小于len,即这个字符在buf中存在,则打印这个字符,否则打印空格 if(((line - j - 1) * N) + i<len) printf("%c",buf[((line-j-1) * N)+i]); else printf(" "); } // 每打印完一行后换行 printf("\n"); } // 主函数返回0,表示程序正常结束 return 0;
}
解题思路:
1.读取与存储:使用gets读取存储下来;
2.我们将其想象为一个二位的字符数组,根据下标的规律输出来即可。假定输入N=3 和012345678古风排版是
6 | 3 | 0 |
7 | 4 | 1 |
8 | 5 | 2 |
我们看到它的规律就是
(列数)*N | ...... | 1*N | 0*N |
(列数)*N+1 | ...... | 1*N+1 | 0*N+1 |
(列数)*N+2 | ...... | 1*N+2 | 0*N+2 |
所以我们按这个规律输出即可,我们的列数是可以通过总字符的格式计算出来的,行数固定,通过列数=字符/行数,其中如果字符/行数不等与0,代表需要在加上一列。
第一列输出空格,这可以通过下标判断是否越界,如果越界输出空格,如果没有正常输出即可。
这篇关于c 语言基础题目:L1-039 古风排版的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!