10035. Простая арифметика

 

Вычислить количество переносов при сложении двух целых чисел.

 

Вход. Каждая строка содержит два целых числа, состоящих из не более, чем 10 знаков. Последняя строка содержит два нуля и не обрабатывается.

 

Выход. Для каждого теста вывести количество переносов при сложении входных чисел в соответствии с форматом, приведенном ниже.

 

Пример входа

123 456

555 555

123 594

0 0

 

Пример выхода

No carry operation.

3 carry operations.

1 carry operation.

 

 

РЕШЕНИЕ

элементарные вычисления

 

Анализ алгоритма

Складываем два числа в столбик, подсчитываем количество переносов.

 

Реализация алгоритма

Поскольку числа содержат до 10 знаков включительно, слагаемые a и b будем держать в переменных типа long long. В переменной carry храним текущий перенос (0 или 1), в res подсчитываем общее число переносов.

 

long long a,b;

int carry, res;

 

Читаем входные слагаемые a и b, обнуляем carry и res. Складываем две последние цифры чисел a и b со значением переноса. Если оно больше 9, то перенос в текущем разряде присутствует, положим carry = 1. Иначе сбрасываем carry = 0. Делим оба слагаемых на 10, тем самым переходя к сложению цифр следующего разряда. Процесс сложения продолжается, пока оба числа содержат в своей записи хотя бы одну цифру.

 

while(scanf("%lld %lld",&a,&b),a + b > 0)

{

  res = carry = 0;

  while((a > 0) || (b > 0))

  {

    if (a%10 + b%10 + carry > 9)

    {

      carry = 1; res++;

    }

    else carry = 0;

    a /= 10; b /= 10;

   }

 

Если переносов не было (res = 0), то выводим слово ‘No’, иначе – значение res. Далее выводим фразу ‘carry operation’ и суффикс ‘s’ если число переносов больше 1. Строка вывода заканчивается точкой.

 

  if (!res) printf("No "); else printf("%d ",res);

  printf("carry operation");

  if (res > 1) printf("s.\n"); else printf(".\n");

}