Школа программиста

Забыли пароль?
[задачи] [курсы] [олимпиады] [регистрация]
Логин:   Пароль:    
Скрыть меню
О школе
Правила
Олимпиады
Фотоальбом
Гостевая
Форум
Архив олимпиад
Архив задач
Состояние системы
Рейтинг
Курсы
Новичкам
Работа в системе
Алгоритмы
Курсы ККДП
Дистрибутивы
Ссылки

HotLog


 

A-B

(Время: 1 сек. Память: 16 Мб Сложность: 44%)

При вычетании длинных чисел удобно вычитать из наибольшего наименьшее, поэтому предварительно нужно их сравнить и в случае необходимости поменять местами. Так как A-B=-(B-A), то в случае когда A < B можно вывести знак "-", а затем положительное значение (B-A). При вычитании будем выполнять поразрядное вычитание с использованием переменной c для хранения значения переноса. Результат операции можно сохранять в массиве a, т.к. ранее используемые разряды фактически не имеют значения для дальнейшего процесса вычисления.

Опишем решение данной задачи в виде следующего алгоритма:

  const maxsize=1001;
  int a[maxsize], b[maxsize];

  readlong(a);
  readlong(b);

  if(complong(a,b) < 0){
    write('-');
    a <--> b;
  }

  c=0;
  for i=1..a[0]{
    c = c+a[i]-b[i]+10;
    a[i] = c mod 10;
    if(c < 10) c=-1; else c=0;
  }
  while(a[a[0]]=0 and a[0]>1) a[0]=a[0]-1;

  writelong(a);

Информацию о представлении длинных чисел и реализации функций readlong, writelong и complong вы можете прочитать здесь.


[Обсуждение] [Все попытки] [Задача]


Красноярский краевой Дворец пионеров, (c)2006 - 2018, ICQ: 151483