例题5-8 UVA 400 Unix Is命令

记录一下代码的巧妙之处吧

1.计算列数,因为最后一列为M个字符,前面的列都是M+2个字符,但总字符长度是60个字符,所以列数为(60 - M) /  (M+2) + 1;

2.计算行数:假设有19个元素吧,5个一行,那么19/5 = 3 但是有4行,所以最后要加1,在比如说有20个元素 20/5+1 = 5 但只有4行,所以要(20-1)/5+1;所以猜测数学表达式为

(n-1) / cols +1;当有15个元素时,有三行,(15-1)/5+1 = 3,成立 当n > 15 && n < 20时,已经验证了(n = 19就是这个范围的代表式),n = 20已经验证了,所以这个数学表达式是正确的!

3.输出元素时,  代码中用了 c *rows +r; c * rows 为不断控制列数(列数++到头在返回!),+ r 指定每一列的第几个元素,这样就可以按照原意输出了!

#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
using namespace std;
const int maxn = 100 + 10;
const int maxcol = 60;
void print(const string&str,int len,char ch){
    cout << str;
    for (int i = 0; i < len - (int)str.length(); ++i)
        cout << ch;
}
int main()
{
    //freopen("out.txt","w",stdout);
    int n,Max;
    while(cin >> n){
        Max = 0;
        string filename[maxn];
        for (int i = 0; i < n; ++i){
            cin>> filename[i];
            Max = max(Max,(int)filename[i].length());
        }
        sort(filename,filename+n);
        int cols = (maxcol - Max) / (Max + 2) + 1;
        int rows = (n - 1 + cols) / cols;
        print("",maxcol,'-');
        cout << "\n";
        for (int r = 0; r < rows; ++r){
            for (int c = 0; c < cols; ++c){
                int idx = c * rows + r;
                if (idx < n)print(filename[idx],c == cols-1? Max : Max + 2,' ');
            }
            cout<<"\n";
        }
    }
    return 0;
}


你可能感兴趣的:(C语言,uva)