Информатика ← ЛабораторныеЛабораторная работа №12

Техника работы с целыми числами. Системы счисления

Задание

Составить программу на языке Си в целом типе данных, которая для любых допустимых и корректно записанных чисел этого типа в десятичном изображении, поступающих на стандартный ввод программы, выполняет указанное вариантом действие над их значениями. Нумерация цифр в записи числа ведется справа налево, от младших разрядов к старшим, начиная с нуля. Результатом действия над введенным числом является целое или булевское значение в зависимости от конкретного варианта, направляемое в стандартный вывод. Предусмотрите корректную обработку пустого файла.

Варианты задания

  1. Удалить среднюю цифру числа.

    < 278 2899
    > 28 2899
    
  2. Выбрать тройки идущих подряд цифр числа, сумма которых максимальная.

    < 1234567 0
    > 567
    
  3. Выбрать идущие подряд тройки цифр, упорядоченных по возрастанию.

    < 12370 321
    < 123 237
    
  4. Выбрать цифры, равные сумме двух предыдущих.

    < 789 1235
    > 3 5
    
  5. Выбрать цифры, равные модулю разности двух предыдущих.

    < 781 110
    > 1 0
    
  6. Вычислить обратный десятичный код.

    < 789 0
    > 210 9
    
  7. Вычислить дополнительный десятичный код.

    < 789 0
    > 209 8
    
  8. Перенести первый блок нулей из младших разрядов в середину десятичной записи числа.

    < 98000 0
    > 90008 0
    
  9. Проверить упорядоченность цифр числа по неубыванию.

    < 7889 9887
    > true false
    
  10. Выполнить циклический сдвиг влево десятичного представления числа.

    < 987 2147483647
    > 789 overflow
    
  11. Выполнить циклический сдвиг вправо десятичного представления числа.

    < -2147483648 9
    > overflow 9
    
  12. Перенести ведущие нули десятичного представления в младшие разряды.

  13. Перенести ведущие нули десятичного представления в середину двоичной записи числа.
  14. Проверить, есть ли одинаковые цифры в смежных разрядах.

    < 998 87189
    > true false
    
  15. Проверить, все ли цифры в смежных разрядах различны.

    < 28394 -1
    > true true
    
  16. Проверить, есть ли цифры, не встречающиеся ни разу.

    < 789 0
    > true true
    
  17. Поменять местами первую и последнюю цифры.

    < 2147483647 0
    > overflow 0
    
  18. Поменять местами вторую и предпоследнюю цифры.

  19. Отсечь первую и последнюю цифры.
  20. Удалить вторую и предпоследнюю цифры.
  21. Приписать в начало и конец по единице.
  22. Удалить все четные цифры из числа.
  23. Удалить все цифры на четных позициях.
  24. Инкрементировать (увеличить на единицу) все четные цифры.
  25. Декрементировать (уменьшить на единицу) все четные цифры.
  26. После каждых двух цифр вставить их сумму, если она также является цифрой.
  27. После каждых двух цифр вставить абсолютное значение их разности.
  28. Получить двоично-кодированное десятичное представление числа.
  29. Получить восьмирично-кодированное десятичное представление числа.
  30. Упорядочить цифры числа попарно по возрастанию.
  31. Упорядочить цифры числа попарно по убыванию.
  32. Проверить, содержит ли число равные количества нулей и единиц в машинном представлении.
  33. Проверить, содержит ли число равные количества нулей и единиц в двоичном виде.

Пример

Проверить палиндромию числа.

Первый вариант. Извлекаем первую и последнюю цифры, сравниваем их, затем вторую и предпоследнюю, сравниваем их и т. д. Если все соответствующие цифры равны, то число является палиндромом.


#include <stdio.h>
#include <stdbool.h>


int len(int a)
{
  if (a == 0)
    return 1;
  int l = 0;
  while (a != 0) {
    a = a / 10;
    ++l;
  }
  return l;
}

int ipow(int a, int n)
{
  int r = 1;
  for (int i = 0; i != n; ++i)
    r *= a;
  return r;
}

bool palindrom(int a)
{
  int first, last;
  int l = len(a);
  int p = ipow(10, l - 1);
  for (int i = 0; i != l / 2; ++i) {
    first = (a / p) % 10;
    last = a % 10;
    if (first != last) {
      return false;
    }
    a /= 10;
    p /= 100;
  }
  return true;

}

int main()
{
  int a;
  scanf("%d", &a);
  printf("%s\n", palindrom(a) ? "true" : "false");
  return 0;
}

Второй вариант. В одной переменной храним первую часть числа, а во вторую переменную кладем вторую часть числа в обратном порядке. Затем сравниваем значения двух переменных.

#include <stdio.h>
#include <stdbool.h>

bool palindrom(int x)
{
  int n = 1, a = x;
  while (a /= 10)
    ++n;
  a = 0;
  int c = n / 2;
  while (c) {
    a = a * 10 + x % 10;
    x /= 10;
    --c;
  }
  if (n % 2)
    x /= 10;
  return x == a;
}


int main()
{
  int x;
  scanf("%d", &x);
  printf("%s\n", palindrom(x) ? "true" : "false");
}

Ссылки и литература.

Оригинальный текст лабораторной