用户体验之页码输出 | ||||||
| ||||||
Description | ||||||
XianGe最近在搞一个论坛。 XianGe说,做一个论坛,用户体验(UE)一定要细致,特别是在输出页码的时候,不要怕麻烦,一定要做出适合用户使用的方式。比如显示论坛的帖子列表,帖子有很多,不可能在一页内就显示完所有帖子的标题,需要分页,但是显示分页时,页码的显示可是很有讲究的。 页码从1开始,页码最多显示9个,其中一个是当前页面页码,如果不是当前页码,数字要用[]包括起来,如果是,两旁留空格即可。如果前面或者后面还有页码,则显示为…,表示省略,这样能让用户知道还有其他的分页。 页码输出的时候要输出当前页码的前4个页码、当前页码和后4个页码,共9个。要尽量输出9个页码,这样能让用户点击更多链接,页面布置也会更加美观。比如有20个帖子,每页只显示1个帖子标题,要显示第2页的,页码列表就应该像这样 [1] 2 [3][4][5][6][7][8][9]... 这有9个页码,当前页码为2,2之前只有1个页码,所以还需要在后面多加上3个页码,共7个,页码9后还有页码,所以需要显示…。 帖子数量在增加,需求在变化,我们要根据不同的帖子数量和每页需要显示的数量来动态的显示页码。现在我们知道帖子总数为n,每页需要显示p个帖子标题,当前查看的页面页码为c。 | ||||||
Input | ||||||
有多组测试数据,每组测试数据为一行,包含三个整数n, p, c, (1<=n<=1000000,1<=p<=10000,1<=c<=ceil(n/p)),含义如题目中描述,ceil函数的意义请参考A题。 处理到文件结束,测试数据组数不超过100。 | ||||||
Output | ||||||
对于每组测试数据,输出一行页码列表。 | ||||||
Sample Input | ||||||
20 1 2 5 1 5 10 1 1 13 1 6 20 2 7 | ||||||
Sample Output | ||||||
[1] 2 [3][4][5][6][7][8][9]... [1][2][3][4] 5 1 [2][3][4][5][6][7][8][9]... ...[2][3][4][5] 6 [7][8][9][10]... ...[2][3][4][5][6] 7 [8][9][10] | ||||||
Source | ||||||
计算机科学与技术学院2012级新生程序设计竞赛(正式赛) | ||||||
Author | ||||||
黄李龙@HRBUST |
如果思路清晰了,AC也就简单了。
思路:(用now来表示当前页码)如果now<6,那么直接从1输出到9,如果n大于9,再输出个...。
如果now>=6,如果n<=9也是从1输出到9,如果n>9,先输出...然后还要分情况讨论,如果now+4<n,那么最后输出...中间九个数从now-4到now+4.相反从,n-8输出到n。
AC代码:
#include<stdio.h>
#include<string.h>
#include<math.h>
using namespace std;
int n,p,now;
void print(int i)
{
if(i==now)
{
printf(" %d ",i);
}
else printf("[%d]",i);
}
int main()
{
while(~scanf("%d%d%d",&n,&p,&now))
{
if(n%p==0)n=n/p;
else n=n/p+1;
if(now<6)
{
for(int i=1; i<=n&&i<=9; i++)
{
print(i);
}
if(n>9)printf("...");
printf("\n");
}
else
{
if(n<=9)
{
for(int i=1;i<=n;i++)
{
print(i);
}
printf("\n");
}
else
{
printf("...");
if(now+4<n)
{
for(int i=now-4; i<=now+4; i++)
{
print(i);
}
printf("...");
}
else
{
for(int i=n-8; i<=n; i++)
{
print(i);
}
}
printf("\n");
}
}
}
}