第 1 集 · A2 · 5 分钟

校园学习 · 第1集 · Задача №27 ЕГЭ по информатике на Си

适合听读练习的俄语真实语料。片段原文开头:Теперь давайте решим двадцать седьмую задачку из демо варианта две тысячи восемнадцатого года на языке Си.

校园学习 · 第1集 · Задача №27 ЕГЭ по информатике на Си

中俄字幕

  1. Теперь давайте решим двадцать седьмую задачку из демо варианта две тысячи

    现在,我们来解2018年演示版的第27题,使用C语言。

  2. восемнадцатого года на языке Си.

    现在,我们来解2018年演示版的第27题,使用C语言。

  3. Итак, познакомимся с условием.

    接下来,我们来看题目条件。

  4. на вход программы поступает последовательность из n целых положительных чисел.

    程序输入一个由n个正整数构成的序列。

  5. целых положительных, то есть больших нуля.

    正整数,即大于零的整数。

  6. Все числа в последовательности различны,

    序列中所有数字互不相同,

  7. повторений нет.

    没有重复数字。

  8. Рассматриваются все пары различных элементов

    考虑序列中所有不同的元素对,

  9. последовательности, причем элементы не обязаны стоять рядом, а порядок элементов в

    这些元素在序列中不必相邻,

  10. паре не важен.

    且元素在对中的顺序无关紧要。

  11. Это значит, что мы не имеем права рассматривать в другом порядке.

    这意味着我们不能以其他顺序来考虑。

  12. Понятно, да? И засчитывать такую пару дважды.

    明白了吗?而且不能将这样的一对重复计算两次。

  13. необходимо определить количество пар, для которых произведение элементов делится на

    需要确定满足元素乘积能被……整除的数对数量

  14. 26. Всё остальное— это точные пояснения, в которых указывается, что в

    26。其余部分均为精确说明,其中指出:

  15. первой строке задаётся количество чисел n, а потом, собственно, идёт n этих самых

    第一行给出数字个数 n,随后即为这 n 个数字。

  16. чисел. Диапазон допустимых чисел— что чисел не более тысячи штук,

    允许的数字范围是:数字个数不超过一千个,

  17. а диапазон чисел не превышает десяти тысяч.

    且每个数字的取值范围不超过一万。

  18. То есть от одного до десяти тысяч сами числа.

    即数字本身在 1 到 10000 之间。

  19. есть пример конкретных входных данных, он нам поможет в тестировании.

    这里有一个具体的输入数据示例,它将帮助我们进行测试。

  20. И еще важное замечание, что требуется написать эффективную по времени и по памяти

    还有一个重要提示:要求编写一个在时间和空间上均高效的程序。

  21. программу. Далее поясняется по сути, что асимптотика по времени должна быть

    程序。接下来实质上说明,时间复杂度应为

  22. линейной. а по памяти константный о от единицы.

    线性的,而空间复杂度应为常数级(即 O(1))

  23. Вот, ну, собственно, что мы дальше можем делать?

    那么,接下来我们具体能做什么呢?

  24. Ну, надо включаться и решать, правильно?

    嗯,得开始动手解题了,对吧?

  25. Значит, мы берем голую программу и начинаем работать.

    于是,我们先拿到最基础的程序,然后开始工作。

  26. Так, ну, с некоторым, я немножко условие сохранил.

    好的,我稍微保留了一点题目条件。

  27. Значит, что мы.

    那么,我们

  28. будем делать. Первое:

    要做的第一件事是:

  29. эту программу можно решать и неэффективно, правда, за это меньше баллов дают.

    这个问题也可以用低效的方式解决,但那样得分会更低。

  30. Но в этом случае решение тривиально.

    但此时解法是显而易见的。

  31. Давайте его сделаем.

    我们来实现它。

  32. Как это будет выглядеть?

    它会是什么样子?

  33. полный перебор.

    穷举法。

  34. Я заведу переменную, в которой будет у меня ответ.

    我将定义一个变量来存储结果。

  35. Она будет у меня называться буквой m,

    我把它命名为字母 m,

  36. например. Я ей кладу начальное состояние 0, а затем я пробегаюсь двумя циклами.

    例如。我先将其初始化为 0,然后用两个循环遍历。

  37. и от нуля до n.

    从 0 到 n。

  38. Да, ну n же надо взять откуда- то.

    是的,n 必须从某处获取。

  39. Я пишу программу нелинейно, не так, как для бумаги, потому что по- хорошему для

    我写的程序不是线性的,不像写在纸上那样,因为严格来说,对于纸面书写,

  40. бумаги мне нужно вначале подумать, а какие переменные мне понадобятся еще.

    我需要先思考还需要哪些变量。

  41. На самом деле в данном случае мне понадобится только массив.

    实际上,在这种情况下,我只需要一个数组。

  42. По- хорошему. Я люблю массивы называть большой буквой А, так я и буду делать.

    最好如此。我喜欢用大写字母 A 来命名数组,我也会这么做。

  43. Мне нужна массив А размера n.

    我需要一个大小为 n 的数组 A。

  44. А если я не знаю заранее размер n?

    如果我事先不知道大小 n 呢?

  45. Ну, можно попытаться сделать вот так вот и понадеяться на то, что язык C к моменту

    嗯,可以尝试这样做,并寄希望于C语言在

  46. создания массива сумеет уже прочитать n.

    创建数组时,已经能够读取n的值了。

  47. Да, он действительно сможет это сделать.

    是的,它确实能做到这一点。

  48. Соответственно, мне нужно передать туда адрес n, ну и переменную n мне надо,

    因此,我需要将n的地址传过去,而且n这个变量我也需要,

  49. естественно, создать, да, количество элементов.

    当然,创建,是的,元素数量。

  50. Да? Давайте в отдельной строке ее что ли создадим.

    是吗?要不我们单独用一行来创建它吧。

  51. Int n. Так, ну и что еще?

    整数 n。好的,那接下来呢?

  52. Мне надо, считав n, создать массив соответствующего размера и считать

    我需要先读入 n,然后创建一个相应大小的数组,并从键盘读取数据存入该数组。

  53. числа с клавиатуры в этот массив.

    即从键盘读取数字并存入该数组。

  54. То есть вот я n раз.

    也就是说,我要循环 n 次。

  55. Да, делаю считывание, соответственно, scanf, я скопипащу.

    对,进行读取操作,即使用 scanf,我来复制粘贴一下。

  56. только не в н, а в а и т.

    但不是读入 n,而是读入 a[i]。

  57. в а и ты. Далее, собственно, пойдет сам алгоритм.

    即读入 a[i]。接下来,就进入算法主体部分了。

  58. Это будет полный перебор.

    这将采用穷举法。

  59. Ну вот, или, скажем так, вот эту переменную m на самом деле можно поближе сюда

    嗯,或者更准确地说,这个变量 m 实际上可以移到读取完数字之后的位置。

  60. притащить к моменту после считывания чисел.

    也就是把变量 m 移到读取完数字之后的位置。

  61. Ну и дальше поехали.

    那么,接下来我们继续。

  62. Я пробегаю по этому массиву, по сути, два раза, прошу прощения, двумя вложенными

    我本质上会遍历这个数组两次,抱歉,是用两个嵌套的

  63. циклами for. и равно нулю,

    for 循环。i 等于 0,

  64. и меньше чем n, и плюс плюс.

    且小于 n,然后自增。

  65. Дальше что делаем?

    接下来我们做什么?

  66. Соответственно, любой парный i,

    相应地,对于任意的 i,

  67. но мне нужно сделать так, чтобы пара i, k не повторялась.

    但我需要确保 i、k 这对组合不重复出现。

  68. Значит, я буду делать так, я буду в цикле вложенном k пробегать значения от i плюс

    因此,我会这样处理:在内层循环中,让 k 从 i 加 1 开始遍历。

  69. один. то есть вот это вот делает

    也就是说,这样做可以

  70. невозможным взять те пары а и тэ, а к тэ, так чтобы она входила два раза.

    避免 a 和 t、a 和 t 这样的组合被重复选取。

  71. Вот. Так, ну что еще?

    好了。好了,还有什么?

  72. k меньше n, k++.

    k 小于 n,k 加 1。

  73. Так, супер. И здесь я просто ставлю условие: если а и тэ, умноженное на.

    好的,超级棒。这里我只加一个条件:如果 a 乘以 t。

来源:Тимофей Хирьянов · CC BY 3.0

同系列