#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个最小的变量。
任何帮助将不胜感激
答案 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]
,非零值表示用户输入相应值的次数)