第 1 集 · A2 · 5 分钟
校园学习 · 第1集 · Задача №27 ЕГЭ по информатике на Си
适合听读练习的俄语真实语料。片段原文开头:Теперь давайте решим двадцать седьмую задачку из демо варианта две тысячи восемнадцатого года на языке Си.

中俄字幕
Теперь давайте решим двадцать седьмую задачку из демо варианта две тысячи
现在,我们来解2018年演示版的第27题,使用C语言。
восемнадцатого года на языке Си.
现在,我们来解2018年演示版的第27题,使用C语言。
Итак, познакомимся с условием.
接下来,我们来看题目条件。
на вход программы поступает последовательность из n целых положительных чисел.
程序输入一个由n个正整数构成的序列。
целых положительных, то есть больших нуля.
正整数,即大于零的整数。
Все числа в последовательности различны,
序列中所有数字互不相同,
повторений нет.
没有重复数字。
Рассматриваются все пары различных элементов
考虑序列中所有不同的元素对,
последовательности, причем элементы не обязаны стоять рядом, а порядок элементов в
这些元素在序列中不必相邻,
паре не важен.
且元素在对中的顺序无关紧要。
Это значит, что мы не имеем права рассматривать в другом порядке.
这意味着我们不能以其他顺序来考虑。
Понятно, да? И засчитывать такую пару дважды.
明白了吗?而且不能将这样的一对重复计算两次。
необходимо определить количество пар, для которых произведение элементов делится на
需要确定满足元素乘积能被……整除的数对数量
26. Всё остальное— это точные пояснения, в которых указывается, что в
26。其余部分均为精确说明,其中指出:
первой строке задаётся количество чисел n, а потом, собственно, идёт n этих самых
第一行给出数字个数 n,随后即为这 n 个数字。
чисел. Диапазон допустимых чисел— что чисел не более тысячи штук,
允许的数字范围是:数字个数不超过一千个,
а диапазон чисел не превышает десяти тысяч.
且每个数字的取值范围不超过一万。
То есть от одного до десяти тысяч сами числа.
即数字本身在 1 到 10000 之间。
есть пример конкретных входных данных, он нам поможет в тестировании.
这里有一个具体的输入数据示例,它将帮助我们进行测试。
И еще важное замечание, что требуется написать эффективную по времени и по памяти
还有一个重要提示:要求编写一个在时间和空间上均高效的程序。
программу. Далее поясняется по сути, что асимптотика по времени должна быть
程序。接下来实质上说明,时间复杂度应为
линейной. а по памяти константный о от единицы.
线性的,而空间复杂度应为常数级(即 O(1))
Вот, ну, собственно, что мы дальше можем делать?
那么,接下来我们具体能做什么呢?
Ну, надо включаться и решать, правильно?
嗯,得开始动手解题了,对吧?
Значит, мы берем голую программу и начинаем работать.
于是,我们先拿到最基础的程序,然后开始工作。
Так, ну, с некоторым, я немножко условие сохранил.
好的,我稍微保留了一点题目条件。
Значит, что мы.
那么,我们
будем делать. Первое:
要做的第一件事是:
эту программу можно решать и неэффективно, правда, за это меньше баллов дают.
这个问题也可以用低效的方式解决,但那样得分会更低。
Но в этом случае решение тривиально.
但此时解法是显而易见的。
Давайте его сделаем.
我们来实现它。
Как это будет выглядеть?
它会是什么样子?
полный перебор.
穷举法。
Я заведу переменную, в которой будет у меня ответ.
我将定义一个变量来存储结果。
Она будет у меня называться буквой m,
我把它命名为字母 m,
например. Я ей кладу начальное состояние 0, а затем я пробегаюсь двумя циклами.
例如。我先将其初始化为 0,然后用两个循环遍历。
и от нуля до n.
从 0 到 n。
Да, ну n же надо взять откуда- то.
是的,n 必须从某处获取。
Я пишу программу нелинейно, не так, как для бумаги, потому что по- хорошему для
我写的程序不是线性的,不像写在纸上那样,因为严格来说,对于纸面书写,
бумаги мне нужно вначале подумать, а какие переменные мне понадобятся еще.
我需要先思考还需要哪些变量。
На самом деле в данном случае мне понадобится только массив.
实际上,在这种情况下,我只需要一个数组。
По- хорошему. Я люблю массивы называть большой буквой А, так я и буду делать.
最好如此。我喜欢用大写字母 A 来命名数组,我也会这么做。
Мне нужна массив А размера n.
我需要一个大小为 n 的数组 A。
А если я не знаю заранее размер n?
如果我事先不知道大小 n 呢?
Ну, можно попытаться сделать вот так вот и понадеяться на то, что язык C к моменту
嗯,可以尝试这样做,并寄希望于C语言在
создания массива сумеет уже прочитать n.
创建数组时,已经能够读取n的值了。
Да, он действительно сможет это сделать.
是的,它确实能做到这一点。
Соответственно, мне нужно передать туда адрес n, ну и переменную n мне надо,
因此,我需要将n的地址传过去,而且n这个变量我也需要,
естественно, создать, да, количество элементов.
当然,创建,是的,元素数量。
Да? Давайте в отдельной строке ее что ли создадим.
是吗?要不我们单独用一行来创建它吧。
Int n. Так, ну и что еще?
整数 n。好的,那接下来呢?
Мне надо, считав n, создать массив соответствующего размера и считать
我需要先读入 n,然后创建一个相应大小的数组,并从键盘读取数据存入该数组。
числа с клавиатуры в этот массив.
即从键盘读取数字并存入该数组。
То есть вот я n раз.
也就是说,我要循环 n 次。
Да, делаю считывание, соответственно, scanf, я скопипащу.
对,进行读取操作,即使用 scanf,我来复制粘贴一下。
только не в н, а в а и т.
但不是读入 n,而是读入 a[i]。
в а и ты. Далее, собственно, пойдет сам алгоритм.
即读入 a[i]。接下来,就进入算法主体部分了。
Это будет полный перебор.
这将采用穷举法。
Ну вот, или, скажем так, вот эту переменную m на самом деле можно поближе сюда
嗯,或者更准确地说,这个变量 m 实际上可以移到读取完数字之后的位置。
притащить к моменту после считывания чисел.
也就是把变量 m 移到读取完数字之后的位置。
Ну и дальше поехали.
那么,接下来我们继续。
Я пробегаю по этому массиву, по сути, два раза, прошу прощения, двумя вложенными
我本质上会遍历这个数组两次,抱歉,是用两个嵌套的
циклами for. и равно нулю,
for 循环。i 等于 0,
и меньше чем n, и плюс плюс.
且小于 n,然后自增。
Дальше что делаем?
接下来我们做什么?
Соответственно, любой парный i,
相应地,对于任意的 i,
но мне нужно сделать так, чтобы пара i, k не повторялась.
但我需要确保 i、k 这对组合不重复出现。
Значит, я буду делать так, я буду в цикле вложенном k пробегать значения от i плюс
因此,我会这样处理:在内层循环中,让 k 从 i 加 1 开始遍历。
один. то есть вот это вот делает
也就是说,这样做可以
невозможным взять те пары а и тэ, а к тэ, так чтобы она входила два раза.
避免 a 和 t、a 和 t 这样的组合被重复选取。
Вот. Так, ну что еще?
好了。好了,还有什么?
k меньше n, k++.
k 小于 n,k 加 1。
Так, супер. И здесь я просто ставлю условие: если а и тэ, умноженное на.
好的,超级棒。这里我只加一个条件:如果 a 乘以 t。
来源:Тимофей Хирьянов · CC BY 3.0