C++ 在C/C+中将循环间隔减少1+;
假设我有15个元素。我希望以这样一种方式对他们进行分组:C++ 在C/C+中将循环间隔减少1+;,c++,c,algorithm,loops,for-loop,C++,C,Algorithm,Loops,For Loop,假设我有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 = 1 - 5
group2 = 6 - 9
group3 = 10 - 12
group4 = 13 - 14
group5 = 15
这样,我将获得每个组中的元素,如下所示:
group1 = 5
group2 = 4
group3 = 3
group4 = 2
group5 = 1
正如您所看到的,循环间隔正在减小
我拿15只作为例子。在实际的程序中,它是用户驱动的参数,可以是任何东西(希望是几千个)
现在我要找的是:
组1中的任何内容都应该有变量“loop”值0,组2应该有1,组3应该有2,依此类推。。。“loop”是一个int变量,用于计算其他内容
我们也换个说法吧
我有一个名为“loop”的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;
如果我理解正确,那么
#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));
}
}
如果你想在开始时进行短距离拉伸,向上舍入这个值可以给我们一个解决方案,也就是说1,2,2,3,3,3
由于您希望拉伸逐渐变短,我们必须颠倒顺序,因此S变为(n-S+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));
}
}
#包括
#包括
#包括
int main(int argc,char*argv[]){
int n=atoi(argv[1]);
int n2=(int)ceil((sqrt(8*n+1)-1)/2);
int上限=n2*(n2+1)/2;
对于(inti=1;i如果我正确理解了这一点,那么
#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));
}
}
如果你想在开始时进行短距离拉伸,向上舍入这个值可以给我们一个解决方案,也就是说1,2,2,3,3,3
因为你想让拉伸逐渐变短,我们必须颠倒顺序,所以S变成(n-S+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));
}
}
#包括
#包括
#包括
int main(int argc,char*argv[]){
int n=atoi(argv[1]);
int n2=(int)ceil((sqrt(8*n+1)-1)/2);
int上限=n2*(n2+1)/2;
对于(int i=1),Ic和C++是不同的语言。选择一个。或者选择您的代码实际上是编写的语言,它不是一个。它是用VX()写的,和C类似。我在寻找算法。C或C++中的一个是好的。您可以忽略“@”。在变量名之前签名。Frame是当前处理帧,您可以将其视为当前索引。int-loop=0;int-loopint=5-loop;if(Frame%loopint==0)loop+=1;我无法理解您的意思。在我看来,这一切在命名方面都是一团糟(除了可能的情况,这些名字来自你的现实问题,它们与通常的编程环境无关)。一般来说,我觉得这是一种XY问题(见Meta SE)。你能描述一下你正在解决的真实问题,而不是循环递减(?)递增(?)的小部分吗一个变量叫做环C和C++是不同的语言。选择一个。或者选择你的代码实际上是写在语言中的,它看起来不是一个。它是用VX()写的,和C类似。我在寻找算法。C或C++中的一个很好。你可以忽略“@”。在变量名之前签名。Frame是当前处理帧,您可以将其视为当前索引。int-loop=0;int-loopint=5-loop;if(Frame%loopint==0)loop+=1;我无法理解您的意思。在我看来,这一切在命名方面都是一团糟(除了可能的情况,这些名字来自你的现实问题,它们与通常的编程环境无关)。一般来说,我觉得这是一种XY问题(见Meta SE)。你能描述一下你正在解决的真实问题,而不是循环递减(?)递增(?)的小部分吗一个叫做loop的变量?