计算三个嵌套for循环的整体进度(%)

时间:2014-12-28 15:49:44

标签: c for-loop progress

我有三个嵌套的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;

5 个答案:

答案 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)

如果我确实理解你的问题,那么我认为每个级别的反变量(即ijk)在%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变量。