Длинная арифметика. Вычитание двух положительных чисел - 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; }
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы
- Проверка на корректность ввода команды (должно быть введено 3 аргумента)
- Объявление переменных i, j, max, term[2], resl
- Проверка на корректность ввода аргументов (должны быть введены только цифры)
- Выделение памяти под массивы term[2] и resl
- Инициализация нулями первого элемента каждого массива
- Заполнение массива term[0] и term[1] значениями длин аргументов
- Заполнение массива resl нулями
- Начиная с max-1, перенос значения из term[0] в term[1] и наоборот, с последующим сложением/вычитанием
- Если результат в max-1 отрицательный, то уменьшение значения в max-1 и увеличение значения в max-2 на 1
- Если результат в max-1 отрицательный, то значение в max-1 заменяется на 9 - resl[ j ]
- Вывод результата вычисления на экран
- Освобождение памяти, выделенной под массивы term[2] и resl
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д