UVa 400 (水题) Unix ls

题意:

有n个文件名,排序后按列优先左对齐输出。设最长的文件名的长度为M,则最后一列长度为M,其他列长度为M+2.

分析:

这道题很简单,但要把代码写的精炼,还是要好好考虑一下的。lrj的代码中有两个亮点,一个是print子函数,一个就是行数的计算。用心体会

 1 #include <iostream>

 2 #include <cstdio>

 3 #include <string>

 4 #include <algorithm>

 5 using namespace std;

 6 

 7 const int maxl = 60;

 8 const int maxn = 100 + 5;

 9 string names[maxn];

10 

11 void print(const string& s, int len, char extra)

12 {

13     printf("%s", s.c_str());

14     for(int i = s.length(); i < len; ++i) putchar(extra);

15 }

16 

17 int main()

18 {

19     //freopen("in.txt", "r", stdin);

20     int n;

21     while(scanf("%d", &n) == 1)

22     {

23         int M = 0;

24         for(int i = 0; i < n; ++i)

25         {

26             cin >> names[i];

27             M = max(M, (int)names[i].length());

28         }

29         sort(names, names + n);

30         int cols = (maxl - M) / (M + 2) + 1, rows = (n - 1) / cols + 1;

31         print("", 60, '-');

32         puts("");

33         for(int r = 0; r < rows; ++r)

34         {

35             for(int c = 0; c < cols; ++c)

36             {

37                 int index = c * rows + r;

38                 if(index < n) print(names[index], c == cols-1 ? M : M+2, ' ');

39             }

40             puts("");

41         }

42     }

43 

44     return 0;

45 }
代码君

 

你可能感兴趣的:(unix)