Как дополнять элементы нулями при выводе (до 8 цифр) - C (СИ)
Формулировка задачи:
Доброе время суток.
Работал с длинной арифметикой, для хранения чисел использовал вектор с основанием . Но тут возникла проблема, как же дополнять элементы нулями при выводе (до 8 цифр).
В С эта проблема решалась бы одной строкой:
А есть ли такой же красивый вариант на С++?
Задачу я уже сдал, но пошел, как мне кажется, не самым удобным способом:
printf ("%08d", a[i]);
#define BASE 100000000 #define LEN 8 // int copy = num[i]; int cnt = 0; while (copy) { copy /= 10; ++cnt; } for (int j = 0; j < LEN - cnt; j++) ofs << 0; ofs << num[i]; // такую штуку приходилось делать с каждой ячейкой.
Хотя, можно еще и так:
for (int j = 0; j < LEN - log10 (num[i]) + 1; j++) ofs << 0; ofs << num[i];
log10 int не возвращает..
Наверное правильнее будет так)
for (int j = 0; j < LEN - floor (log10 (num[i])) + 1; j++) ofs << 0; ofs << num[i];
Решение задачи: «Как дополнять элементы нулями при выводе (до 8 цифр)»
textual
Листинг программы
#include <iostream> #include <fstream> #include <vector> #include <iomanip> #define BASE 100000000 #define LEN 8 void power (std::vector <int> &, const int); int main() { std::ifstream ifs ("INPUT.TXT"); std::ofstream ofs ("OUTPUT.TXT"); std::vector <int> num; int var, pow; ifs >> var >> pow; num.push_back (var); for (int i=0; i<pow-1; i++) power (num, var); ofs << num.back (); for (int i = num.size () - 2; i >= 0; i--) ofs << std::setfill ('0') << std::setw (LEN) << num[i]; ifs.close (); ofs.close (); return 0; } void power (std::vector <int> &vec, const int var) { long carry = 0; for (int i = 0; i < vec.size () || carry; i++) { if (i == vec.size ()) vec.push_back (0); carry += vec[i] * var; vec[i] = carry % BASE; carry /= BASE; } }
Объяснение кода листинга программы
- #include
— подключает библиотеку для ввода-вывода данных - #include
— подключает библиотеку для работы с файлами - #include
— подключает библиотеку для работы с векторами - #include
— подключает библиотеку для манипуляций с выводом (например, установка ширины поля вывода) - #define BASE 100000000 — определяет базовое значение для умножения (10^7)
- #define LEN 8 — определяет длину числа в десятичных разрядах (до 8 цифр)
- void power (std::vector
&, const int); — объявляет функцию power - int main() — объявляет основную функцию программы
- std::ifstream ifs (
INPUT.TXT
); — открывает файл для чтения - std::ofstream ofs (
OUTPUT.TXT
); — открывает файл для записи - std::vector
num; — объявляет вектор для хранения чисел - int var, pow; — объявляет переменные для считывания из файла
- ifs >> var >> pow; — считывает из файла два числа (var и pow)
- num.push_back (var); — добавляет первое число в вектор
- for (int i=0; i<pow-1; i++) — начинает цикл для умножения числа var на себя pow-1 раз
- power (num, var); — вызывает функцию power для вектора num и числа var
- ofs << num.back (); — записывает в файл последний элемент вектора (результат последнего умножения)
- for (int i = num.size () - 2; i >= 0; i--) — начинает цикл для записи оставшихся чисел в обратном порядке (сначала меньшие разряды)
- ofs << std::setfill ('0') << std::setw (LEN) << num[i]; — выводит число с заполнением нулями до 8 цифр
- ifs.close (); — закрывает файл для чтения
- ofs.close (); — закрывает файл для записи
- return 0; — завершает программу
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д