UVA - 400 Unix ls

本文提供了一个关于Vjudge网题目UVA-400的解决方案,主要讲解了如何处理文件名排序及格式化输出的问题。文章分享了作者在解决过程中遇到的常见陷阱,包括字符长度计算、列数和行数的确定方法,以及如何根据列顺序进行正确的输出。

题目地址:https://vjudge.net/problem/UVA-400

大致题意:输入n个文件名,排序后左对齐输出,一行最多输出60字符,并且每列最右一列M字符,其他列为M+2字符

我碰到的几个坑:1求出最长的字符,每次求字符长度时用length()记得int强制类型转换

                             2求列数可以先减去最右列,剩下每列M+2,看有几列最后再加一列姐可以了

                             3求行数的时候用n/列数求出可能会有余数没有考虑,所以n-1再除,求出后加一就是所有行

                             4所有排序的数字是以列为顺序,但是输出要以行输出,这里就存在一个输出时下标的问题,每个数的下标就是这个数所处的行数+所处的列数*总行数,列数*行数是用来求当前列前面的数,再加上行数

                             5输出的时候最右列M个字符,其他列M+2字符

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#define maxn 100
using namespace std;
string filename[maxn];
void print(const string& s,int k,char ch)
{
    cout<<s;
    for(int i=0;i<k-s.length();i++)
        cout<<ch;
}

int main()
{
    int n;
    while(cin>>n)
    {
        int M=0;
        for(int i=0;i<n;i++)
        {
            cin>>filename[i];
            M=max((int)filename[i].length(),M);
        }
        int cols=(60-M)/(M+2)+1;
        int rows=(n-1)/cols+1;
        print("",60,'-');
        cout<<"\n";
        sort(filename,filename+n);
        for(int i=0;i<rows;i++)
        {
            for(int j=0;j<cols;j++)
            {
                int k=i+rows*j;
                if(k<n)
                    print(filename[k],j==cols-1?M:M+2,' ');
            }
            cout<<"\n";
        }
    }
    return 0;
}
AC Code

 

转载于:https://www.cnblogs.com/Rysort/p/9449329.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值