题意是给你一坨字符串, 让你按要求格式化输出.
这里有几个关键点.
首先, 要知道一行输出几个单词.根据题意, 一行最多60个字符.列方程可得一行单词数 col = 62 / (maxlen + 2)
然后就可以得出行数 raw = 总数/col. 如果有小数raw + 1.
其他就没什么问题了.
#include <cstdio>
#include <cstring>
#include <cstdlib>
int cmp_string(const void *_a, const void *_b)
{
char *a = (char *)_a;
char *b = (char *)_b;
return strcmp(a, b);
}
int main()
{
//freopen("input.txt", "r", stdin);
char name[1100][70];
int n, _n;
int i, j;
int max;
int col;
int row;
int cnt;
while (scanf("%d", &n) == 1)
{
_n = n;
max = 0;
cnt = 0;
memset(name, 0, sizeof(name));
getchar();
for (i = 0; i < n; i++) //读取输入
gets(name[i]);
for (i = 0; i < 60; i++) //输出-
printf("-");
printf("\n");
qsort(name, n, sizeof(name[0]), cmp_string); //按ASCII排序.
for (i = 0; i < n; i++) //得到字符串长度的最大值.
{
int len = strlen(name[i]);
if (len > max)
max = len;
}
col = 62 / (max + 2); //得出一行输出多少个.
while (_n % col != 0)
_n++;
row = _n / col; //得出有多少行.
//接下来输出.
for (;cnt < row; cnt++)
{
for (i = cnt; i < n; i += row)
{
printf("%s", name[i]);
if (i + row >= n)
{
for (j = 0; j < max - strlen(name[i]); j++)
printf(" ");
}
else
for (j = 0; j < max - strlen(name[i]) + 2; j++)
printf(" ");
}
printf("\n");
}
}
return 0;
}