Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <fstream>
- #include <vector>
- #include <string>
- #include <ostream>
- #include <iomanip>
- using namespace std;
- static const int BASE = 1000000000; // система счистления
- static const int baseLen = 9; // длина основания
- struct LongInteger {
- vector<unsigned long long> digits; // вектор, в котором лежат разряды чисел
- bool negative; //знак числа
- };
- struct divStruct { // структура, которая нам нужна для возвращения результатов деления
- LongInteger li; // лнам
- unsigned long long int mod; // остаток
- };
- void remove_zeros(LongInteger val) { // удаление ведущих нулей
- while (val.digits.size() > 1 && val.digits.back() == 0) {
- val.digits.pop_back();
- }
- if (val.digits.size() == 1 && val.digits[0] == 0)
- val.negative = false;
- }
- LongInteger create_li(string s) { //создаем переменную лонгит
- LongInteger num; //запись результатп
- if (s.length() == 0)
- num.negative = false;
- else {
- if (s[0] == '-') {
- s = s.substr(1); //начинаем с индекса 1
- num.negative = true;
- } else
- num.negative = false;
- for (long long i = s.length(); i > 0; i -= baseLen) {
- if (i < baseLen)
- num.digits.push_back(atoi(s.substr(0, i).c_str())); // последние элементы добавляем от 0 до i
- else
- num.digits.push_back(atoi(s.substr(i - baseLen,
- baseLen).c_str())); // крайние 9 элемнтов в первую ячейку запихиваем(запись числа с конца)
- }
- }
- remove_zeros(num); // вызываем функцию
- return num;
- }
- void output(ostream &os, const LongInteger &li) { //поток вывода в аргуманта
- if (li.digits.empty()) // если пустой
- os << 0;
- else {
- if (li.digits.size() == 1) {
- os << li.digits[0];
- return;
- }
- os << li.digits.back(); // выводим с конца
- char old_fill = os.fill('0'); // заполняю чар нулями
- for (unsigned long long i = (li.digits.size() - 2); i >= 0; i--) // выводим число
- if (i <= li.digits.size() - 2)
- os << setw(baseLen) << li.digits[i]; // сколько нужно вывести
- else {
- os.fill(old_fill); // заполняем промежутки нулями
- return;
- }
- }
- }
- divStruct div_long_and_short(LongInteger left, unsigned long long int b) { // функция деления длинного на короткое
- unsigned long long carry = 0; // остаток. по умолчанию 0
- LongInteger a = std::move(left); // создаем копию лнама, чтобы не менять данный
- for (int i(a.digits.size() - 1); i >= 0; i--) { // идем с конца лнама
- unsigned long long cur = a.digits[i] + carry * BASE; // в текущее число записываем остаток,
- // умноженный на основание + число в текущей ячейке
- a.digits[i] = (unsigned long long) (cur / b); // записываем в ячейку див текущего числа на короткое
- carry = (unsigned long long) (cur % b); // в остаток кладем остаток :)
- }
- while (a.digits.size() > 1 and a.digits.back() == 0) { // избавляемся от незначащих нулей, если они есть
- a.digits.pop_back();
- }
- divStruct toReturn; // создаем структуру для возварата ответа
- toReturn.li = a; // в лнам кладем результат
- toReturn.mod = carry; // остаток
- return toReturn;
- }
- int main() {
- ifstream fin("input.txt");
- ofstream fout("output.txt");
- string n1;
- long long a2;
- fin >> n1;
- fin >> a2;
- LongInteger a1 = create_li(n1);
- divStruct divRes = div_long_and_short(a1, a2);
- LongInteger a3 = divRes.li;
- // вывод
- output(fout, a3);
- fout << '\n' << divRes.mod;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement