首页 > 解决方案 > 数学 - 返回索引添加先前跳过的索引的函数

问题描述

我试图找到一种方法来跳过一些索引并将跳过的索引数添加到索引中。

例如,

我想跳过所有可被 4 整除的索引,并添加那些跳过的索引。

即,如果index = 44 mod 4 == 0index 变为 5

如果index = 8 , 8 mod 4 == 0, 但index 变为 10,因为我们已经不得不跳过 4。

同样,如果index = 16 , 16 mod 4 == 0, 但index 变为 21。因为 16 + 4 = 20,又是 4 的倍数,所以我们跳过它并转到下一个索引 21。

好的,让我尝试通过我正在尝试的代码片段来解释它。

int fn(int i) {
    if (i <= 0) {
        return 0;
    }
    if (i % 4 == 0) {
        return fn(i / 4) + (i / 4);
    } else {
        return i / 4;
    }
}

for (int i = 0; i < 100; i++) {
    int bl = fn(i);
    cout << "block:" << i << endl << "Translated:" << bl << endl;
}

但正如您所见,它无法正常工作。有任何想法吗?

标签: c++

解决方案


每个由四个连续数字组成的块(如 1、2、3、4 或 5、6、7、8)都包含三个可用索引和一个应该跳过的索引。所以我们需要做的就是:

  • 除以三得到所需的块数。
  • 将该数字乘以四,以从多个可用索引切换到多个原始索引。
  • 添加余数模三以说明最后一个块中的位置。
  • 调整是因为我们显然想从索引 1 开始。因此调整是减一(转换为从零开始的索引),进行上述计算,然后加一(转换回从一开始的索引)。

这个程序:

#include <stdio.h>


int fn(int i)
{
    return (i-1)/3*4 + (i-1)%3 + 1;
}


int main(void)
{
    for (int i = 1; i < 17; ++i)
        printf("%d -> %d.\n", i, fn(i));
}

产生这个输出:

1 -> 1。
2 -> 2。
3 -> 3。
4 -> 5。
5 -> 6。
6 -> 7。
7 -> 9。
8 -> 10。
9 -> 11。
10 -> 13。
11 -> 14。
12 -> 15。
13 -> 17。
14 -> 18。
15 -> 19。
16 -> 21。

推荐阅读