using System;
using System.Linq;
class Program {
static void Main() {
int n = Convert.ToInt32(Console.ReadLine());
int[] a = new int[n];
Random r = new Random();
for (int i = 0; i < a.Length; i++) {
a[i] = r.Next(-100, 101);
Console.Write(a[i] + " ");
}
Console.WriteLine();
int min = a.Min();
int im = 0, k = 0;
while (a[im] != min) {
if (a[im] < 0 && a[im] !=min) k++;
im++;
}
int nb = n - k;
int[] b = new int[nb];
int j = 0;
for (int i = 0; i < n; i++ ) {
if (i < im && a[i] < 0);
else {
b[j] = a[i];
j++;
}
}
foreach (int i in b)
Console.Write (i + " ");
}
}
Он получил произведение исходных чисел.
За странным описанием процесса по сути скрывается описание алгоритма умножения в столбик двоичных чисел: на i-м шаге, если первое число нечетное (=если на i-м месте справа в первом числе стоит 1), к сумме прибавляется 2^(i - 1) * второе число (=если всё записано в двоичной системе счисления, умножение на степень двойки равносильно сдвигу числа влево).
Инвариант тут такой: в любой момент времени сумма всех чисел, записанных на доске, и произведения чисел, записанных на карточке, не меняется.
Сначала на примере, если на карточке записаны 5 и 7:
карточка: 5 и 7, сумма на доске: 0карточка: 2 и 14, сумма на доске: 7карточка: 1 и 28, сумма на доске: 7карточка: 0 и 56, сумма на доске: 7 + 28 = 35В общем случае: пусть перед текущим шагом на доске числа a и b, сумма чисел на доске s; значение суммы ab + s. Есть два случая:
a = 2a'. Тогда на следующем шаге на карточке будет a' и 2b, на доске ничего не изменится. Значение суммы a' * 2b + s = 2a' * b + s = ab + sa = 2a' + 1. На следующем шаге на карточке a' и 2b, на доску добавится b. Значение суммы a' * 2b + s + b = (2a' + 1) b + s = ab + sИзначально на доске выписаны числа суммой 0 (инвариант равен произведению чисел на карточке = p), в конце произведение чисел на карточке равно 0, тогда сумма выписанных чисел равна p.
2. Добро
3. Байт
4. Каталог, папка. директория, фолдер
5. Окно
6. Документ
7. Операционная система
8. Бит
9. Файл