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

Объяснение кода листинга программы

  1. #include — подключает библиотеку для ввода-вывода данных
  2. #include — подключает библиотеку для работы с файлами
  3. #include — подключает библиотеку для работы с векторами
  4. #include — подключает библиотеку для манипуляций с выводом (например, установка ширины поля вывода)
  5. #define BASE 100000000 — определяет базовое значение для умножения (10^7)
  6. #define LEN 8 — определяет длину числа в десятичных разрядах (до 8 цифр)
  7. void power (std::vector &, const int); — объявляет функцию power
  8. int main() — объявляет основную функцию программы
  9. std::ifstream ifs (INPUT.TXT); — открывает файл для чтения
  10. std::ofstream ofs (OUTPUT.TXT); — открывает файл для записи
  11. std::vector num; — объявляет вектор для хранения чисел
  12. int var, pow; — объявляет переменные для считывания из файла
  13. ifs >> var >> pow; — считывает из файла два числа (var и pow)
  14. num.push_back (var); — добавляет первое число в вектор
  15. for (int i=0; i<pow-1; i++) — начинает цикл для умножения числа var на себя pow-1 раз
  16. power (num, var); — вызывает функцию power для вектора num и числа var
  17. ofs << num.back (); — записывает в файл последний элемент вектора (результат последнего умножения)
  18. for (int i = num.size () - 2; i >= 0; i--) — начинает цикл для записи оставшихся чисел в обратном порядке (сначала меньшие разряды)
  19. ofs << std::setfill ('0') << std::setw (LEN) << num[i]; — выводит число с заполнением нулями до 8 цифр
  20. ifs.close (); — закрывает файл для чтения
  21. ofs.close (); — закрывает файл для записи
  22. return 0; — завершает программу

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.889 из 5
Похожие ответы