Простая Длинная арифметика - 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 для вывода результата на экран
- Закрытие всех потоков ввода/вывода
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д