uva 400 Unix ls 文件输出排版 排序题
这题的需要注意的地方就是计算行数与列数,以及输出的控制。
题目要求每一列都要有能够容纳最长文件名的空间,两列之间要留两个空格,每一行不能超过60。
简单计算下即可。
输出时我用循环输出空格来解决对齐的,其实可以用一个很巧妙的方法,用printf("%-*s", k, file[i]),查过资料后发现*放到转换字符之间可以当作替代符,后面可以输入一个变量(如k)来控制,这句代码意思是输出左对齐(对应负号)的宽度为k(对应*)的字符串file[i]。
代码:
#include <cstdio> #include <iostream> #include <cmath> #include <string> #include <algorithm> using namespace std; const int maxn = 101; int n; int main() { string file[maxn]; int cmax; while (scanf("%d", &n) != EOF) { printf("------------------------------------------------------------\n"); cmax = 0; for (int i = 0; i < n; i++) { cin >> file[i]; cmax = max(cmax, (int)file[i].size()); } int col = 62 / (cmax + 2); int row = ceil(1.0 * n / col); sort (file, file + n); for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { // printf("%s", file[i * row + j]); int t = j * row + i; if (t >= n) continue; cout << file[t]; int k = cmax - file[t].size(); while (k--) printf(" "); if (j != col - 1) printf(" "); } if (i <= row - 1) printf("\n"); } } return 0; }