我有三个嵌套的for循环,每个循环显然都有一个限制。要计算三个for循环中任何一个循环的进度,我需要做的就是将当前迭代除以循环将进行的迭代总次数。但是,鉴于有三个不同的for循环,我如何计算完整的百分比?
int iLimit = 10, jLimit = 24, kLimit = 37;
for (int i = 0; i < iLimit; i++) {
for (int j = 0; j < jLimit; j++) {
for (int k = 0; k < kLimit; k++) {
printf("Percentage Complete = %d", percentage);
}
}
}
我尝试了以下代码,但在每个循环完成后重置,达到大于100的百分比。
float percentage = ((i + 1) / (float)iLimit) * ((j + 1) / (float)jLimit) * ((k + 1) / (float)kLimit) * 100;
答案 0 :(得分:5)
您可以轻松计算每个内循环的百分比变化&#34;
const double percentChange = 1.0 / iLimit / jLimit / kLimit;
注意,这在数学上等同于1/(iLimit*jLimit*kLimit)
,但是如果iLimit jLimit kLimit足够大,则会出现溢出和意外行为。使用1.0 / ...方法仍然可能出现下溢,但其可能性较小。
int iLimit = 10, jLimit = 24, kLimit = 37;
const double percentChange = 1.0 / iLimit / jLimit / kLimit;
double percentage = 0;
for (int i = 0; i < iLimit; i++) {
for (int j = 0; j < jLimit; j++) {
for (int k = 0; k < kLimit; k++) {
percentage += percentChange;
printf("Percentage Complete = %d\n", (int)(percentage * 100));
}
}
}
答案 1 :(得分:1)
如果我确实理解你的问题,那么我认为每个级别的反变量(即i
,j
,k
)在%age公式中应该有不同的权重。让我解释一下我的意思:j
的每个增量对应于最内层循环的kLimit
次迭代。因此,如果您只有一个嵌套级别(比如使用i
的最外层循环不存在),循环迭代的总数将为kLimit*jLimit
和百分比:
percentage = (100.0 * (j*kLimit + k + 1)) / (float)(kLimit*jLimit)
你明白了吗?很容易将这个概念概括为所需的嵌套级别。我希望你能很好地找出你所需要的等式。无论如何这里是最终的公式:
percentage = 100.0 * (kLimit * (i * jLimit + j) + k + 1) / (iLimit * jLimit * kLimit)
答案 2 :(得分:0)
循环总数为iLimit * jLimit * kLimit
,因此如果内循环中有一个递增percentage
,则只需打印
100 * percentage / (iLimit * jLimit * kLimit)
由于您使用%d
打印百分比,因此可以将所有内容限制为整数计算。 (并且它避免在第一步中看到无意义的'确切'值,例如0.011261
。)
如果要查看正确舍入的值,也可以使用:
printf("Percentage Complete = %d%%\r", (counter*200+iLimit * jLimit * kLimit) /
(2 * iLimit * jLimit * kLimit));
最后的\r
是一个小改进,所以每一行都会叠印上一行。
答案 3 :(得分:-1)
试试这个:
int iLimit = 10, jLimit = 24, kLimit = 37;
float percentage;
for (int i = 0; i < iLimit; i++) {
for (int j = 0; j < jLimit; j++) {
for (int k = 0; k < kLimit; k++) {
percentage = ((k+1) + j * kLimit + i*jLimit*kLimit)/(float)(iLimit*jLimit*kLimit) * 100;
printf("Percentage Complete = %f\n", percentage);
}
}
}
此解决方案与此处发布的计数器增量解决方案非常相似。 这个解决方案的优点是我为计数器提供了一个公式,它取决于i,j,k和极限iLimit,jLimit,kLimit:
counter = (k+1) + j * kLimit + i*jLimit*kLimit
通过这种方式,您可以在不知道i,j,k的情况下找出百分比,而无需遍历循环。 因此,您可以将O(iLimit * jLimit * kLimit)问题减少为O(1)问题。
答案 4 :(得分:-2)
请记住,百分比是100的一部分。
要获得100,你需要做到,例如(iLimit * jLimit * kLimit) / (iLimit * jLimit * kLimit) * 100
。
循环的每次迭代都需要1 / (iLimit * jLimit * kLimit)
个部分。
获得百分比,&#34;简单地&#34;例如。
float percentage = ++counter / (float) (iLimit * jLimit * kLimit) * 100.0;
请记住在循环之前声明并初始化counter
变量。