c++ - 数学 - 返回索引添加先前跳过的索引的函数
问题描述
我试图找到一种方法来跳过一些索引并将跳过的索引数添加到索引中。
例如,
我想跳过所有可被 4 整除的索引,并添加那些跳过的索引。
即,如果index = 4,4 mod 4 == 0
则index 变为 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;
}
但正如您所见,它无法正常工作。有任何想法吗?
解决方案
每个由四个连续数字组成的块(如 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。
推荐阅读
- swift - CollectionViewCell、MapView 和自定义注解
- spring - Spring Security + Primefaces - 无法处理 viewexpiredeception
- ios - UIPopoverPresentationController.barButtonItem 不起作用,似乎被忽略了
- dart - Dart 是否有相当于 Python 的 Pickle 来序列化对象集合?
- c# - 如何在从不同网络登录站点帐户时修复错误
- elasticsearch - 设置 Logstash Netflow 仪表板和可视化
- perl - 无法打开 perl 脚本“./script.pl”:权限被拒绝
- java - 在表格行中添加的图像占用了更多的行空间
- python - python luigi:requires() 不能返回 Target 对象
- sql - 使用 Access ODBC 驱动程序时拒绝访问