Как дополнять элементы нулями при выводе (до 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; — завершает программу