Простая Длинная арифметика - C (СИ)

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

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

Доброго времени суток! У меня задача. Вводим 3 числа,достаточно больших,чтобы они не помещались в стандартные типы данных. Далее надо вывести самое большое число на экран. В общем-то я разобрался что ,да как,задача не слишком сложная,но тут я отсылаю на проверку ее(на сайте acmp это 7 задача) и у мменя выходит ошибка компиляции,хотя в code::blocks на компьютере все нормально. Я так понял это происходит потому,что могут быть числа записаны и через много пробелов и через enter,а я их считываю как идущих через пробел.Так вот,вопрос,как считать 3 числа,когда они могут идти через несколько пробелов? INPUT.txt 987531 234 86364 в OUTPUT.txt выводим результат.Код программы выкладываю ниже.
#include<stdio.h>
#include<string.h>
int main(void)
{
    char str[100],str1[100],str2[100];
    int a[100],b[100],c[100];
    int i;
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    scanf("%s",str);
    a[0] = strlen(str);
    for(i = 1;i <= a[0];i++)
    a[a[0] - i + 1] = str[i - 1] - 48;
    scanf("%s",str1);
    b[0] = strlen(str1);
    for(i = 1;i <= b[0];i++)
    b[b[0] - i + 1] = str1[i - 1] - 48;
    scanf("%s",str2);
    c[0] = strlen(str2);
    for(i = 1;i <= c[0];i++)
    c[c[0] - i + 1] = str2[i - 1] - 48;
    if(complong(a,b) == 1 && complong(a,c) == 1)
    writelong(a);
    if(complong(a,b) == -1 && complong(b,c) == 1)
    writelong(b);
    if(complong(c,a) == 1 && complong(c,b) == 1)
    writelong(c);
}
int writelong(int *a)
{
    int i;
    for(i = a[0];i >= 1;i--)
    printf("%d",a[i]);
return 0;
}
int complong(int *a, int *b)
{
    int i;
    if(a[0] > b[0]) return 1;
    if(a[0] < b[0]) return -1;
    for(i = a[0];i >= 1;i--)
    {
        if(a[i] > b[i]) return 1;
        if(a[i] < b[i]) return -1;
    }
return 0;
}
Буду признателен за помощь!

Решение задачи: «Простая Длинная арифметика»

textual
Листинг программы
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
#include <iterator>
 
std::ofstream ofs("OUTPUT.TXT");
 
void show(int a)
{
    ofs << a;
}
 
std::vector<size_t> str_to_vec(std::string &str)
{
    std::vector<size_t> vec;
 
    for(int i = 0; i < str.length(); ++i)
        vec.push_back(str[i] - '0');
 
    return vec;
}
 
std::vector<size_t> get_max_size(std::vector<size_t> &a, std::vector<size_t> &b,
                                            std::vector<size_t> &c)
{
    int max = std::max(a.size(), std::max(b.size(), c.size()));
    return max == a.size()? a : max == b.size()? b : c;
}
 
std::vector<size_t> get_max_in_two(std::vector<size_t> &a, std::vector<size_t> &b)
{
    int cnt = 0;
    if(a.size() == b.size())
    {
        for(int i = 0; i < a.size(); ++i)
        {
            if(a[i] == b[i])
            {
                ++cnt;
                continue;
            }
 
            else
                return a[i] > b[i]? a : b;
        }
 
        if(cnt == a.size())
            return a;
    }
 
    else
        return a.size() > b.size() ? a : b;
}
 
int main()
{
    std::ifstream ifs("INPUT.TXT");
    std::vector<size_t> _1, _2, _3, _tmp, max;
 
    std::string tmp;
    getline(ifs, tmp, ' ');
    _1 = str_to_vec(tmp);
 
    getline(ifs, tmp, ' ');
    _2 = str_to_vec(tmp);
 
    getline(ifs, tmp);
    _3 = str_to_vec(tmp);
 
    _tmp = (_1.size() == _2.size()? get_max_in_two(_1, _2) : (_1.size() > _2.size()? _1 : _2));
    max = (_tmp.size() == _3.size()? get_max_in_two(_tmp, _3) : (_tmp.size() > _3.size()? _tmp : _3));
    std::for_each(max.begin(), max.end(), show);
 
    return 0;
}

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

  1. Объединение чисел из трех строк в три вектора (переменные _1, _2, _3)
  2. Создание временного вектора _tmp для хранения максимального значения из двух векторов
  3. Создание вектора max для хранения окончательного результата
  4. Чтение трех строк из файла INPUT.TXT и разделение их на числа с помощью функции str_to_vec
  5. Использование функции get_max_size для определения максимального размера векторов
  6. Использование функции get_max_in_two для нахождения максимального значения из двух векторов одинакового размера
  7. Использование функции for_each для вывода результата на экран
  8. Закрытие всех потоков ввода/вывода

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


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

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

13   голосов , оценка 4.462 из 5