Длинная арифметика. Вычитание двух положительных чисел - 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