Длинная арифметика. Вычитание двух положительных чисел - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток! У меня не получается сделать вычитание двух длинных положительных чисел... Пыталась разбираться по чужим кодам - там либо используют структуры, классы или векторы, которых я не знаю, либо такие элементы кода, которые я вообще не понимаю. Буду очень-очень благодарна, если вы напишете код с поясняющими для чайника комментариями!)

Решение задачи: «Длинная арифметика. Вычитание двух положительных чисел»

textual
Листинг программы
#include <stdio.h>
#include <string.h>
#include <ctype.h>
 
int main( int argc, char* argv[] ) {
   if( argc != 3 ) {
      printf( "ошибочный формат команды\n" );
      return 1;
   }
   int i, j;
   for( i = 0; i < strlen( argv[ 1 ] ); i++ ) 
      if( !isdigit( argv[ 1 ][ i ] ) ) {
         printf( "ошибочный аргумент команды %s\n", argv[ 1 ] );
         return 2;
      }
   for( i = 0; i < strlen( argv[ 2 ] ); i++ ) 
      if( !isdigit( argv[ 2 ][ i ] ) ) {
         printf( "ошибочный аргумент команды %s\n", argv[ 2 ] );
         return 2;
      }
   int max = ( strlen( argv[ 1 ] ) > strlen( argv[ 2 ] ) ? 
               strlen( argv[ 1 ] ) : strlen( argv[ 2 ] ) ) + 1;
   int *term[ 2 ] = { 
      (int*)calloc( max, sizeof( int ) ),
      (int*)calloc( max, sizeof( int ) ),
                    };
   for( i = 0; i < 2; i++ ) {
      term[ i ][ 0 ] = 0;
      for( j = 0; j < max - 1; j++ ) {
         term[ i ][ max - j - 1 ] =  j < strlen( argv[ i + 1 ] ) ? 
            argv[ i + 1 ][ strlen( argv[ i + 1 ] ) - j - 1 ] - '0' : 0;
      }
   }                    
   int *resl = (int*)calloc( max, sizeof( int ) );
   memset( resl, 0, max * sizeof( int ) );
   for( j = max - 1; j > 0; j-- ) {
      resl[ j ] = resl[ j ] + term[ 0 ][ j ] - term[ 1 ][ j ];
      if( resl[ j ] < 0 ) {
         resl[ j ] += 10;
         resl[ j - 1 ] -= 1;
      }
   }
   if( resl[ 0 ] < 0 ) {
      for( j = 1; j < max; j++ ) 
         resl[ j ] = 9 - resl[ j ];
      resl[ max - 1 ]++; 
   }
   printf( "%s - %s = %c", argv[ 1 ], argv[ 2 ], resl[ 0 ] < 0 ? '-' : '+' );
   for( j = 1; j < max; j++ ) 
      printf( "%c", resl[ j ] + '0' ); 
   printf( "\n" );
   return 0;
}

Объяснение кода листинга программы

  1. Включаются необходимые заголовочные файлы
  2. Проверка на корректность ввода команды (должно быть введено 3 аргумента)
  3. Объявление переменных i, j, max, term[2], resl
  4. Проверка на корректность ввода аргументов (должны быть введены только цифры)
  5. Выделение памяти под массивы term[2] и resl
  6. Инициализация нулями первого элемента каждого массива
  7. Заполнение массива term[0] и term[1] значениями длин аргументов
  8. Заполнение массива resl нулями
  9. Начиная с max-1, перенос значения из term[0] в term[1] и наоборот, с последующим сложением/вычитанием
  10. Если результат в max-1 отрицательный, то уменьшение значения в max-1 и увеличение значения в max-2 на 1
  11. Если результат в max-1 отрицательный, то значение в max-1 заменяется на 9 - resl[ j ]
  12. Вывод результата вычисления на экран
  13. Освобождение памяти, выделенной под массивы term[2] и resl

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.2 из 5
Похожие ответы