题目地址: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; }