首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C/C++中将循环间隔减少1

在C/C++中将循环间隔减少1
EN

Stack Overflow用户
提问于 2016-11-26 21:50:49
回答 1查看 1.2K关注 0票数 0

假设我有15个元素。我想用这样一种方式将他们分组:

代码语言:javascript
复制
group1 = 1 - 5
group2 = 6 - 9
group3 = 10 - 12
group4 = 13 - 14
group5 = 15

这样,我将获得每个组中的元素,如下所示:

代码语言:javascript
复制
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。

代码语言:javascript
复制
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是当前处理帧号。

代码语言:javascript
复制
int loopint = 5 - @loop;

if (@Frame % loopint == 0)
    @loop += 1;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-26 22:10:53

如果我正确理解了,那么

代码语言:javascript
复制
#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解这个,我们得到

代码语言:javascript
复制
n = (sqrt(8 * S + 1) - 1) / 2

如果你想在一开始就想要短距离的话,把它向上舍入,即1,2,2,3,3,3,.

因为你想要伸展变得越来越短,我们必须颠倒顺序,所以S变成(n + 1)。所以上面的公式。

编辑:注意,除非数据集中的元素数量精确地符合n* (n+1) /2模式,否则在开始或结束时都会有较短的伸展。这一实施将不规则的延伸置于开头。如果你最后想要他们,

代码语言:javascript
复制
#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));
  }
}

就这么做。这将计算元素计数之外的下一个这样的数字,然后计算如果有那么多元素,您将拥有的数字。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40823527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档