/ Материалы / Язык программирования: Си/Си++ / Сумма и умножение (Длинная арифметика) (Си/Си++)

Сумма и умножение (Длинная арифметика) (Си/Си++)

Задание:

Дан входной файл, в котором первые два числа - длины чисел, а вторые два числа - сами числа. Необходимо считать эти данные в выходной файл, а также вывести сумму и произведение этих чисел. (Большие числа)

Идея:

Сложность программы в том, что нет типа, в который мы бы могли положить к примеру 30-значное число, поэтому тут нужно использовать длинную арифметику. Будем хранить числа в виде массивов, где каждый цифра числа - элемент массива. Вручную проделаем операции над числами. 


Решение (Visual studio):


#include <stdio.h>
#include "stdlib.h"
#include "conio.h"

void Summ(int *a, int *b, int size1, int size2)
{
 FILE *out;
 fopen_s(&out, "out.txt", "a+");
 if (size1 > size2)
 {
 int *sum = new int[size1 + 1];
 for (int i = 0; i < size1 + 1; i++)
 sum[i] = 0;

 for (int i = 0; i < size2; i++)
 {
 sum[i] += a[i] + b[i];
 sum[i + 1] += sum[i] / 10;
 sum[i] %= 10;
 }
 for (int i = size2; i < size1; i++)
 {
 sum[i] += a[i];
 sum[i + 1] += sum[i] / 10;
 sum[i] %= 10;
 }
 fprintf(out, "\nSumm:");
 for (int i = size1; i >= 0; i--)
 fprintf_s(out, "%d", sum[i]);
 fprintf_s(out, "\n");
 fclose(out);
 return;
 }
 else
 {
 int *sum = new int[size2 + 1];
 for (int i = 0; i < size2 + 1; i++)
 sum[i] = 0;

 for (int i = 0; i < size1; i++)
 {
 sum[i] += a[i] + b[i];
 sum[i + 1] += sum[i] / 10;
 sum[i] %= 10;
 }
 for (int i = size1; i < size2; i++)
 {
 sum[i] += b[i];
 sum[i + 1] += sum[i] / 10;
 sum[i] %= 10;
 }
 fprintf(out, "\nSumm:");
 for (int i = size2; i >= 0; i--)
 fprintf_s(out, "%d", sum[i]);
 fprintf_s(out, "\n");
 fclose(out);
 return;
 }
}

void Multiplication(int *a, int *b, int size1, int size2)
{
 FILE *out;
 fopen_s(&out, "out.txt", "a+");
 int *mult = new int[size1 + size2 + 1];

 for (int i = 0; i < size1 + size2 + 1; i++)
 mult[i] = 0;
 for (int i = 0; i < size1; i++)
 for (int j = 0; j < size2; j++)
 mult[i + j] += a[i] * b[j];

 for (int i = 0; i < size1 + size2 + 1; i++)
 {
 mult[i + 1] += mult[i] / 10;
 mult[i] %= 10;
 }
 fprintf(out, "Mult:");
 for (int i = size1 + size2 - 1; i >= 0; i--)
 fprintf_s(out, "%d", mult[i]);
 fprintf_s(out, "\n");
 fclose(out);
 return;
}


int main(int argc, char* argv[])
{
 FILE *in, *out;
 fopen_s(&in, "in.txt", "r");
 fopen_s(&out, "out.txt", "w+");
 int size1, size2;
 fscanf_s(in, "%d%d", &size1, &size2);
 fprintf(out, "size1:%d\nsize2:%d\n", size1, size2);
 int *a = new int[size1];
 int *b = new int[size2];
 char tmp;
 fscanf_s(in, "%c", &tmp, 1);
 fprintf(out, "First number:");
 for (int i = size1 - 1; i >= 0; i--)
 {
 fscanf_s(in, "%c", &tmp, 1);
 a[i] = (int)tmp - 48;
 fprintf(out, "%d", a[i]);
 }
 fscanf_s(in, "%c", &tmp, 1);
 fprintf(out, "\n");
 fprintf(out, "Second number:");
 for (int i = size2 - 1; i >= 0; i--)
 {
 fscanf_s(in, "%c", &tmp, 1);
 b[i] = (int)tmp - 48;
 fprintf(out, "%d", b[i]);
 }
 fclose(out);
 //Сумма двух чисел
 Summ(a, b, size1, size2);
 printf("\n");

 //Умножение двух чисел
 Multiplication(a, b, size1, size2);
 fclose(in);
 fclose(out);
 printf("\n");
 _getch();
 return 0;
}
 

Пример входного файла:



Пример выходного файла:



Похожие материалы

Поделитесь в социальных сетях

Наверх