假设我有15个元素。我想用这样一种方式将他们分组:
group1 = 1 - 5
group2 = 6 - 9
group3 = 10 - 12
group4 = 13 - 14
group5 = 15这样,我将获得每个组中的元素,如下所示:
group1 = 5
group2 = 4
group3 = 3
group4 = 2
group5 = 1如您所见,循环间隔正在减少。
我举了15个例子。在实际的程序中,它是用户驱动的参数,可以是任何东西(希望只有几千个)。
现在我要找的是: group1中的任何东西都应该有变量“循环”值0,group2应该有1,group3应该有2等等……“循环”是一个int变量,用于计算其他内容。
让我们换句话来说
我有一个名为“循环”的int变量。我想给它赋值:首先n帧循环值0,然后(n -1)帧循环值1,然后接下来(n - 2)帧循环值2一直到循环值(n - 1)。
假设我的时间线上有15帧。
因此n为5 ====>>>>> (5 +4+3+2+1= 15;间隔减小1)。
然后
前5帧(1- 5)环路为0,接下来4帧(6- 9)环路为1,接下来3帧(10- 12)环路为2,接下来2帧(13- 14)环路为3,最后帧(15)环路为4。
frames "loop" value
1 - 5 => 0
6 - 9 => 1
10 - 12 => 2
13 - 14 => 3
15 => 4我试过模(%)。但是问题是帧12循环是2,所以(12 %(5-2))余数是0,所以它增加了循环值。下面的行是在求解器中运行的示例代码。@循环默认为0,@Frame是当前处理帧号。
int loopint = 5 - @loop;
if (@Frame % loopint == 0)
@loop += 1;发布于 2016-11-26 22:10:53
如果我正确理解了,那么
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, char *argv[]) {
int n = atoi(argv[1]);
for(int i = 1; i <= n; ++i) {
printf("%d: %f\n", i, ceil((sqrt(8 * (n - i + 1) + 1) - 1) / 2));
}
}是C中的一个实现。
后面的数学是这样的:1+2+3+4+5有一个Gau和,对于n项,它有一个封闭形式S=n* (n + 1) /2。为n解这个,我们得到
n = (sqrt(8 * S + 1) - 1) / 2如果你想在一开始就想要短距离的话,把它向上舍入,即1,2,2,3,3,3,.
因为你想要伸展变得越来越短,我们必须颠倒顺序,所以S变成(n + 1)。所以上面的公式。
编辑:注意,除非数据集中的元素数量精确地符合n* (n+1) /2模式,否则在开始或结束时都会有较短的伸展。这一实施将不规则的延伸置于开头。如果你最后想要他们,
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, char *argv[]) {
int n = atoi(argv[1]);
int n2 = (int) ceil((sqrt(8 * n + 1) - 1) / 2);
int upper = n2 * (n2 + 1) / 2;
for(int i = 1; i <= n; ++i) {
printf("%d: %f\n", i, n2 - ceil((sqrt(8 * (upper - i + 1) + 1) - 1) / 2));
}
}就这么做。这将计算元素计数之外的下一个这样的数字,然后计算如果有那么多元素,您将拥有的数字。
https://stackoverflow.com/questions/40823527
复制相似问题