gpt4 book ai didi

c# - 分页数学问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:01:17 25 4
gpt4 key购买 nike

我有一个分页问题:

我的表中有大量页面,结果为 ~50.000 页,我的分页逻辑类似于:1 2 3 ...50000我想做类似的事情:

1 2 3 10 100 500 1000 5000 10000 50000

当我点击例如 1111 时:

1 1109 1110 1111 1112 1113 1114 1120 1200 1700 2200 3000 8000 10000 50000

到目前为止我已经尝试过这样的事情:

int Max_count = (int)Math.Floor(Math.Log10(totalPages) + 1);
for (int index = start; index <= end; index++)
{
if (index == pageNumber)
{
header.Items.Add(new PagingHeaderModelItem(PageHeaderItemType.CurrentPage, pageNumber));
}
else if (index == start)
{
header.Items.Add(new PagingHeaderModelItem(PageHeaderItemType.StartPage, 0));
}
else if (index == end)
{
header.Items.Add(new PagingHeaderModelItem(PageHeaderItemType.EndPage, totalPages - 1));
}
else if ((index == start + 1) && (index > 1))
{
header.Items.Add(new PagingHeaderModelItem(PageHeaderItemType.MorePages, -1));
}
else if ((index == end - 1) && (index < totalPages - 2))
{
header.Items.Add(new PagingHeaderModelItem(PageHeaderItemType.MorePages, -1));
}
else if ((index > 100) && (index > totalPages / 2))
{
header.Items.Add(new PagingHeaderModelItem(PageHeaderItemType.SimplePage, index));
}
else if ((pageNumber + 2 > index) && index + 10 < totalPages && !isSecond)
{
for (int temp = 1; temp < Max_count; temp++)
{
int power_var = (int)Math.Pow(10, temp);
int power_var_prev = (int)Math.Pow(10, temp - 1);
if ((pageNumber > power_var) || pageNumber < 10)
{
header.Items.Add(new PagingHeaderModelItem(PageHeaderItemType.SimplePage, power_var - 1));
header.Items.Add(new PagingHeaderModelItem(PageHeaderItemType.SimplePage, power_var - 1 + power_var_prev));

temp++;
}
}
isSecond = true;
}
else if (index - start < 3)
{
header.Items.Add(new PagingHeaderModelItem(PageHeaderItemType.SimplePage, index));
}

但我觉得我根本不接近这个。我不是在寻求解决方案,更多的是我可以自己使用的提示或公式


稍后编辑

模式应该是这样的:

n-3,                                  // 1         //1 
n-2, // 2 //1109
n-1, // 3 //1110
**n**, // **4** //1111
n+1, //5 //1112
n+2, //6 //1113
n+3, //7 //1114
Math.Floor((index + 10)) / 10) * 10, //10 //1120
Math.Floor((index + 10)) / 10) * 10 +50, //60 //1170
Math.Floor((index + 100)) / 100) * 100, //100 //1200
Math.Floor((index + 100)) / 100) * 100+500,//600 //1700
Math.Floor((index + 1000)) / 1000) * 1000,//1000 //2000
Math.Floor((index + 1000)) / 1000) * 1000+5000,//6000/7000

....

最佳答案

下面是一些打印所需值的代码:

(它也打印 1108,但这应该很容易解决)

(将 +50、+500 等更改为 +40、+400 等,因为我更喜欢那样)

int min = 1, max = 50000;

if (val-3 > min)
Console.WriteLine(min);

for (int i = Math.Max(min, val-3); i <= Math.Min(max, val+3); i++)
Console.WriteLine(i);

int last = -1;
for (int i = 10; ; i *= 10)
{
int next = (val+3 + i) / i * i;
if (next > max)
break;
// prevent printing something like 90, 130, 100, 500 (100 won't print)
if (next > last)
Console.WriteLine(next);
next += 4*i;
if (next > max)
break;
Console.WriteLine(next);
last = next;
}

Live demo .

如果你也想从值到最小值打印它,这可能是复制 for 循环并反转值的简单情况:(它将从最大值打印值,更改它需要一个栈数据结构)

for (int i = 10; ; i *= 10)
{
int next = (val-3 - i) / i * i;
if (next < min)
break;
if (next < last)
Console.WriteLine(next);
next -= 4*i;
if (next < min)
break;
Console.WriteLine(next);
last = next;
}
if (last != min)
Console.WriteLine(min);

这是另一个想法:

1..50000中的1111为例

取前 2 个值和后 2 个值 - 1109, 1110, 1111, 1112, 1113

假设我们希望朝着目标呈指数增长,中间有 5 个百分点。

向上的值范围为 50000 - 1113 = 48887(从上面的最大值开始)。

然后我们想找到 x 使得 (5x)^2 = 48887。这很容易计算,只需对 48887 开平方并除以 5 - sqrt(48887)/5 = 44.22

那么值将是:

1113 + (1 * 44.22) ^ 2 = 3068
1113 + (2 * 44.22) ^ 2 = 8934
1113 + (3 * 44.22) ^ 2 = 18712
1113 + (4 * 44.22) ^ 2 = 32400
1113 + (5 * 44.22) ^ 2 = 50000

同样适用于向下。

如果您愿意,您可以根据目标的距离确定中间值的数量。

如果您更喜欢更多的整数,我得再考虑一下。

关于c# - 分页数学问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19977751/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com