Задание:
Дан входной файл, в котором первые два числа - длины чисел, а вторые два числа - сами числа. Необходимо считать эти данные в выходной файл, а также вывести сумму и произведение этих чисел. (Большие числа)
Идея:
Сложность программы в том, что нет типа, в который мы бы могли положить к примеру 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;
}
Пример входного файла:
Пример выходного файла: