Расставить недостающие фрагменты программы так, чтобы в результате получилось решение задачи: Найти сумму чисел от 10 до 100. Var S, x: integer; Begin ; x=; while do begin S:=; x:= end; write(); end.
Запишем все четыре слагаемых в виде степеней двойки:
1)
в двоичном виде это единица и 624 нуля
2)
в двоичном виде это минус единица и 600 нулей
3)
в двоичном виде это единица и 2754 нуля
4)
в двоичном виде это -10000000 (минус единица и 7 нулей)
Берём двоичное слагаемое с наибольшим абсолютным значением:
1000...(всего 2754 нуля)
Начали с положительного, к нему прибавим ещё одно положительное:
1000...(всего 624 нуля)
Получим следующее число:
1...(2754 -1 -624 нулей)...1...(624 нуля)
Посчитаем нули (а единиц там только две):
1...(2129 нулей)...1...(624 нуля)
Теперь пошли отрицательные. Вычитаем следующее значение:
1000...(всего 600 нулей)
Чтобы вычесть, придётся занять у ближайшего старшего разряда с единицей (у той единицы, которая после 624 нулей). Она заменится на ноль, а после неё все нули заменятся на единицы, после которых будут идти 600 нулей в конце). Вот что получится:
Действуем, так же, как вычитали только что (занимаем у последней из 24-ёх единиц) -она заменится на ноль, а после неё нули заменятся на единицы почти до конца (в конце будет семь нулей):
Тот же результат я получил и в программе на Паскале (проверял в PascalABC.NET 3.4.2). Скрин этого можно посмотреть ниже (там же можно посмотреть, как полностью выглядит получившееся двоичное число).
#include "stdafx.h" #include "malloc.h" #include <iostream> using namespace std;
int _tmain(int argc, _TCHAR* argv[]) { // Вводим исходные данные. int m; int n; printf ("Введите количество столбцов? m = "); cin >> m; printf ("Введите количество строк? n = "); cin >> n;
// Инициализируем другие переменные. int xMin = 0, // левая граница спирали xMax = m, // правая граница спирали (не включая ее, поэтому ниже будет использоваться xMax - 1) yMin = 0, // верхняя граница спирали yMax = n, // нижняя граница спирали (не включая ее, поэтому ниже будет использоваться yMax - 1) i = 0, // текущее число x, y; // расходный материал.
// Бесконечный цикл, пока не заполним матрицу. while (1) { // Заполняем верхний ряд слева направо. for (x = xMin; x < xMax; x++) pMatrix[x + yMin * m] = i++; // Заполнили весь верхний ряд. Подвигаем вниз верхнюю границу. yMin ++; // Если верхняя граница совпала с нижней, то заканчиваем цикл. if (yMin == yMax) break;
// Заполняем правый ряд сверху вниз. for (y = yMin; y < yMax; y++) pMatrix[xMax - 1 + y * m] = i++; // Заполнили весь правый ряд. Подвигаем налево правую границу. xMax --; // Если правая граница совпала с левой, то заканчиваем цикл. if (xMax == xMin) break;
// Заполняем нижний ряд справа налево. for (x = xMax - 1; x >= xMin; x--) pMatrix[x + (yMax - 1) * m] = i++; // Заполнили весь нижний ряд. Подвигаем вверх нижнюю границу. yMax --; // Если верхняя граница совпала с нижней, то заканчиваем цикл. if (yMin == yMax) break;
// Заполняем левый ряд снизу вверх. for (y = yMax - 1; y >= yMin; y--) pMatrix[xMin + y * m] = i++; // Заполнили весь левый ряд. Подвигаем направо левую границу. xMin ++; // Если правая граница совпала с левой, то заканчиваем цикл. if (xMax == xMin) break; // если мы все еще здесь, значит идем на очередной виток спирали.. . }
// Есть предположение, что спираль заполнена. Напечатаем ее, посмотреть.. . for (y = 0; y < n; y++) { // Печатаем строку. for (x = 0; x < m; x++) printf ("i, ", pMatrix[x + y * m]); // Переходим на другую строку. printf ("\r\n"); }
// Освобождаем память и выходим. free (pMatrix); pMatrix = 0; }
617 единиц
Объяснение:
Запишем все четыре слагаемых в виде степеней двойки:
1)
в двоичном виде это единица и 624 нуля
2)
в двоичном виде это минус единица и 600 нулей
3)
в двоичном виде это единица и 2754 нуля
4)
в двоичном виде это -10000000 (минус единица и 7 нулей)
Берём двоичное слагаемое с наибольшим абсолютным значением:
1000...(всего 2754 нуля)
Начали с положительного, к нему прибавим ещё одно положительное:
1000...(всего 624 нуля)
Получим следующее число:
1...(2754 -1 -624 нулей)...1...(624 нуля)
Посчитаем нули (а единиц там только две):
1...(2129 нулей)...1...(624 нуля)
Теперь пошли отрицательные. Вычитаем следующее значение:
1000...(всего 600 нулей)
Чтобы вычесть, придётся занять у ближайшего старшего разряда с единицей (у той единицы, которая после 624 нулей). Она заменится на ноль, а после неё все нули заменятся на единицы, после которых будут идти 600 нулей в конце). Вот что получится:
1...(2129 +1 нулей)...(624 -600 единиц)...(600 нулей)
Посчитав, получим всего 25 единиц в числе:
1...(2130 нулей)...(24 единицы)...(600 нулей)
Далее, вычитаем следующее значение:
10000000 (единица и 7 нулей)
Действуем, так же, как вычитали только что (занимаем у последней из 24-ёх единиц) -она заменится на ноль, а после неё нули заменятся на единицы почти до конца (в конце будет семь нулей):
1...(2130 нулей)...(24 -1 единиц)...0...(600 -7 единиц)...(7 нулей)
Посчитав, получим такое число:
1...(2130 нулей)...(23 единицы)...0...(593 единицы)...(7 нулей)
И, количество единиц в этом числе равно:
1 + 23 + 593 = 617 единиц
Тот же результат я получил и в программе на Паскале (проверял в PascalABC.NET 3.4.2). Скрин этого можно посмотреть ниже (там же можно посмотреть, как полностью выглядит получившееся двоичное число).
#include "malloc.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
// Вводим исходные данные.
int m;
int n;
printf ("Введите количество столбцов? m = ");
cin >> m;
printf ("Введите количество строк? n = ");
cin >> n;
// Создаем матрицу.
int* pMatrix = (int*) malloc (m * n * sizeof (int));
// Инициализируем другие переменные.
int xMin = 0, // левая граница спирали
xMax = m, // правая граница спирали (не включая ее, поэтому ниже будет использоваться xMax - 1)
yMin = 0, // верхняя граница спирали
yMax = n, // нижняя граница спирали (не включая ее, поэтому ниже будет использоваться yMax - 1)
i = 0, // текущее число
x, y; // расходный материал.
// Бесконечный цикл, пока не заполним матрицу.
while (1)
{
// Заполняем верхний ряд слева направо.
for (x = xMin; x < xMax; x++)
pMatrix[x + yMin * m] = i++;
// Заполнили весь верхний ряд. Подвигаем вниз верхнюю границу.
yMin ++;
// Если верхняя граница совпала с нижней, то заканчиваем цикл.
if (yMin == yMax)
break;
// Заполняем правый ряд сверху вниз.
for (y = yMin; y < yMax; y++)
pMatrix[xMax - 1 + y * m] = i++;
// Заполнили весь правый ряд. Подвигаем налево правую границу.
xMax --;
// Если правая граница совпала с левой, то заканчиваем цикл.
if (xMax == xMin)
break;
// Заполняем нижний ряд справа налево.
for (x = xMax - 1; x >= xMin; x--)
pMatrix[x + (yMax - 1) * m] = i++;
// Заполнили весь нижний ряд. Подвигаем вверх нижнюю границу.
yMax --;
// Если верхняя граница совпала с нижней, то заканчиваем цикл.
if (yMin == yMax)
break;
// Заполняем левый ряд снизу вверх.
for (y = yMax - 1; y >= yMin; y--)
pMatrix[xMin + y * m] = i++;
// Заполнили весь левый ряд. Подвигаем направо левую границу.
xMin ++;
// Если правая граница совпала с левой, то заканчиваем цикл.
if (xMax == xMin)
break;
// если мы все еще здесь, значит идем на очередной виток спирали.. .
}
// Есть предположение, что спираль заполнена. Напечатаем ее, посмотреть.. .
for (y = 0; y < n; y++)
{
// Печатаем строку.
for (x = 0; x < m; x++)
printf ("i, ", pMatrix[x + y * m]);
// Переходим на другую строку.
printf ("\r\n");
}
// Освобождаем память и выходим.
free (pMatrix);
pMatrix = 0;
}