我正在为自定义谷歌地图控件制作自定义数据寻呼机。控件需要确定要显示的页面范围。例如,如果用户在第6页上,则控件必须显示第1页到第10页。如果用户在第37页上,则控件必须显示第30页到第40页。
我可用的变量是:
X - 总结果(地图上的点)
Y - 当前页面大小。即每页的分数 Z - 显示当前页面
Q - 要显示的页码数(常量为10)
我想出了:
起始索引 = Z - ( Z % Q )
结束索引 = Z - ( Z % Q )+ Q
然而,当当前页面小于10时,这不起作用。它也不能确定是否达到最大页面,即我们总是显示10的全范围。但是,如果我们显示范围30-40,最终页面实际上可能是38。
如果有人能提出更优雅的算法,我们将不胜感激。
答案 0 :(得分:9)
如果从章节的角度思考,可能会更容易。
假设每组页面都是章节,章节从0,1,2,...开始编号
然后第r章的页面在
范围内Q r + 1< = page< = Q (r + 1)
现在考虑楼层(页面/ Q)。如果页面不是Q的倍数,则为r,否则为r + 1。
给定一个r,你可以找到章节的页面为Lower = Q r + 1和更高= min(max,Q (r + 1))。
所以你可以这样做。
if (Z < 1 || Z > max_page) { error;}
if (Z % Q == 0) {
r = Z/Q - 1; // integer division, gives floor.
}
else {
r = Z/Q; // floor.
}
Begin = Q*r + 1;
End = Min (Q*(r+1), max_page);
要删除if,您现在可以用
替换它if (Z < 1 || Z > max_page) { error;}
r = (Z-1)/Q;
Begin = Q*r + 1;
End = Min (Q*(r+1), max_page);
这是因为:
Q r + 1&lt; = Z&lt; = Q (r + 1)当且仅当
Q r&lt; = Z-1&lt; = Q r +(Q-1)。
因此floor((Z-1)/ Q)= r。
答案 1 :(得分:4)
我们走了:
def lower(Z):
return (Z - 1) // Q * Q + 1
def upper(Z):
return min(int(ceil(X / Y)), ((Z - 1) // Q + 1) * Q)
//
是整数除法。