Простая Длинная арифметика - 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, _2, _3)
- Создание временного вектора _tmp для хранения максимального значения из двух векторов
- Создание вектора max для хранения окончательного результата
- Чтение трех строк из файла INPUT.TXT и разделение их на числа с помощью функции str_to_vec
- Использование функции get_max_size для определения максимального размера векторов
- Использование функции get_max_in_two для нахождения максимального значения из двух векторов одинакового размера
- Использование функции for_each для вывода результата на экран
- Закрытие всех потоков ввода/вывода