无法理解for循环

时间:2018-11-06 08:35:31

标签: c

#include <stdio.h>

int n, a[100001], x, y;
int main() {
    scanf("%d", &n);
    while (n--) {
        scanf("%d.%d", &x, &y);
        a[x*1000+y]++;
    }
    for (int i = 0, c = 0; i <= 100000; i++) {
        while (a[i]) {
            --a[i], ++c;
            printf("%d.%03d\n", i / 1000, i % 1000);
            if (c == 7) return 0;
        }
    }

    return 0;
}

这是接收整数n的代码,则程序应接收n个双精度或整数变量。

该程序应该将输入变量中最小的7个变量打印到3个小数点。

现在的问题是我似乎无法弄清楚这段代码在for循环中的作用

while (a[i]) {
    --a[i], ++c;  // <- specifically this part
    printf("%d.%03d\n", i / 1000, i % 1000);
    if (c == 7) return 0;
}

生成7个最小的变量。

任何帮助将不胜感激

3 个答案:

答案 0 :(得分:3)

假设8.3是输入,那么您将数组的8003rd索引存储为1,即a [8003] = 1。如果两次输入8.3,则a [8003]等于2。 因此,在for循环中,当i = 8003时,a [8003]不为零,这意味着输入为8.3。因此,它被认为是前7个最小的输入值,并且当计数达到7时,循环退出。

答案 1 :(得分:1)

就像下面提到的那样,这是不好的代码,如果您是学生,请远离这种编程风格(不仅仅是学生,每个人都应远离)。

此代码的作用是创建某种“查找”表。 只要输入数字,它就会增加该数组实例的计数。

例如如果输入3.2,它将增加第a[3002]个位置。的代码是:

scanf("%d.%d", &x, &y);
        a[x*1000+y]++;

x = 3且y = 2所以a [3 * 1000 + 2] ++-> a [3002] = 1

(注意:代码假定数组a的初始化为0-另一个坏习惯)

现在说我输入1.9,代码将递增a[1009]。如果我再次输入3.2,a[3002]将再次增加。

这是输入部分。

现在代码从0开始解析整个数组a。首先它将遇到1009,代码将打印1.9并继续解析数组。 当它找到7个非零位置时,循环退出。

当您再次输入相同的数字(如3.2)时,while(a[i])将再次执行两次以打印相同的数字。

由于较小的数字将位于数组的较低位置,并且数组解析从0开始,因此它将打印最小的7个数字。如果反转for循环,则可以打印7个最大的数字。

答案 2 :(得分:0)

这里的答案是如何存储输入数据。

用户输入的值填充数组a。它不存储实际输入的数字,而是存储一个COUNT输入值的次数(代码对数据的完整性做出了很多假设,但可以忽略它)

数据自然是从最小到最大排序的,因此要查找7个最小的输入,您只需获取前7个值(通过索引i跟踪的迭代,c跟踪我们已经打印了多少个值),其中COUNT不为零(a[i],非零值表示用户输入相应值的次数)