С Новым годом! Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
1552 / 918 / 193
Регистрация: 26.03.2010
Сообщений: 3,105

Как дополнять элементы нулями при выводе (до 8 цифр)

25.03.2011, 21:43. Показов 2572. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе время суток.

Работал с длинной арифметикой, для хранения чисел использовал вектор с основанием https://www.cyberforum.ru/cgi-bin/latex.cgi?{10}^{8}. Но тут возникла проблема, как же дополнять элементы нулями при выводе (до 8 цифр).
В С эта проблема решалась бы одной строкой:
C
1
printf ("%08d", a[i]);
А есть ли такой же красивый вариант на С++?
Задачу я уже сдал, но пошел, как мне кажется, не самым удобным способом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#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];
// такую штуку приходилось делать с каждой ячейкой.
Добавлено через 7 минут
Хотя, можно еще и так:
C++
1
2
3
for (int j = 0; j < LEN - log10 (num[i]) + 1; j++)
    ofs << 0;
ofs << num[i];
Добавлено через 2 минуты
log10 int не возвращает..
Наверное правильнее будет так)

C++
1
2
3
for (int j = 0; j < LEN - floor (log10 (num[i])) + 1; j++)
    ofs << 0;
ofs << num[i];
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.03.2011, 21:43
Ответы с готовыми решениями:

При выводе цифр на консоль выдает не те цифры
Вместо 2 вообще 50. Ввожу double x = Convert.ToDouble(Console.Read()); Console.WriteLine(x); Результат:

Количество значащих цифр при выводе чисел
#include &lt;GL\freeglut.h&gt; #include &lt;cmath&gt; #include &lt;iostream&gt; #include &lt;iomanip&gt; using namespace std; const float PI_F =...

Задать количество цифр после запятой при выводе
Здравствуйте! Подскажите, пожалуйста, как сделать так, чтобы Матлаб выводил (и считал) числа с одной, двумя и т.д. знаками после...

13
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
25.03.2011, 21:43
Нужно было обеспечить только хранение и вывод?
Тогда можно число обрабатывать как string.

Если нужно еще выполнять арифметику, то string можно распотрошить на цифры непостредственно перед употреблением.
1
1552 / 918 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
25.03.2011, 22:03  [ТС]
IrineK, нет, не только )
А если выполнять арифметику, то в стринге можно хранить только по одной цифре в ячейке.. да и неудобнее он)

Добавлено через 7 минут
Вот, работает правильно, точно:

C++
1
2
3
for (int j = 0; j < LEN - floor (log10 (num[i])) - 1; j++)
    ofs << 0;
ofs << num[i];
Ну мб еще будут какие-нибудь предложения?)
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
25.03.2011, 22:09
neske, смотри манипуляторы setw и setfill.
2
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
25.03.2011, 22:09
Если string перезапустить в поток можно сразу считывать int заданной длины.
1
1552 / 918 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
25.03.2011, 22:15  [ТС]
fasked, чудно! Спасибо!
Получилась такая красота:
C++
1
std::cout << std::setfill ('0') << std::setw (LEN) << num[i];

IrineK, и вам спасибо,)
1
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
25.03.2011, 22:40
neske, есть ещё один подводный камень... Я как-то сделал что-то вроде
C++
1
std::cout << std::left << std::setfill('0') << std::setw(2) << ( 6 + 2 );
и долго "неправильному" результату удивлялся...
2
1552 / 918 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
25.03.2011, 22:45  [ТС]
Я, честно говоря, с манипулятором left не знаком, но посмотрев в справке, вроде как понял.
Кстати, убрав его, в вашем примере будет все ок)
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
25.03.2011, 22:46
Цитата Сообщение от neske Посмотреть сообщение
Кстати, убрав его, в вашем примере будет все ок
вроде как по-умолчанию right используется
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
25.03.2011, 23:01
Цитата Сообщение от neske Посмотреть сообщение
Кстати, убрав его, в вашем примере будет все ок)
Ну само собой Это я к тому, что не внимательно прописав вывод добрый час проверял логику, пытаясь понять, где результат лишний раз на 10 умножается.
0
1552 / 918 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
25.03.2011, 23:02  [ТС]
А после этого доброго часа, небось радости было хоть отбавляй ?))
0
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
26.03.2011, 02:43
neske:
если выполнять арифметику, то в стринге можно хранить только по одной цифре в ячейке
Разбивка string на вектора по 8:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
#include <sstream>
#include <iomanip>
#define M 8
using namespace std;
 
int main()
{   int i,k, cur;
    string num="123456788765432112345610000000";
    for(i=num.length()%8,k=0;i<num.length();i+=(M+1))
        num.insert(i," ");
 
    int* figs = new int [num.length()/M];
    
    i=0;
    istringstream ist(num);
    while (ist>>cur)
    {   figs[i]=cur;
        i++;
    }
 
    for(i=0;i<num.length()/M;i++)
        cout<<setfill ('0')<<setw (M)<< figs[i]<<" ";
    
    
    delete []figs;
    cin.get();
    return 0;
}
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
26.03.2011, 10:28
IrineK, В строках хранить не эффективно. Перегонять в int для арифметики тем более. Мне вот почему-то кажется, что складывать числа будут больше, чем печатать. Да и зачем все усложнять. Строки здесь даже идеологически не уместны. Конечно, для вывода может и было бы лучше исполнить метод toString, но если этот вывод просто для отладки, то зачем.
0
1552 / 918 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
26.03.2011, 10:58  [ТС]
IrineK, ну привык я работать с массивами..)
Если нужно будет кому вдруг, возводит число A в степень B.

Код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#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;
    }
}
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.03.2011, 10:58
Помогаю со студенческими работами здесь

Ограничить количество цифр после запятой при выводе
Label9-&gt;Caption = k; k - типа float в Label9 выводит 0,39551515616...., как ограничить количество цифр после запятой?

При выводе посредством cout() получается один и тот же набор цифр
Здравствуйте дорогие форумчане. У меня трабл. В независимости от того что я подаю в cout, результат вывода у меня всегда один и тот же...

При выводе результата не делать пробела между группами из двух цифр
Дана программа: title LaborRabota1 sts SEGMENT PARA STACK 'Stack' DW 32 DUP (?) sts ENDS data SEGMENT ...

При выводе ArrayList<T> выводит последние элементы
Класс Words:public class Words { public int Id; public String WordEnglish; public String WordRussian; public String...

С++\Раскрасить при выводе розовым цветом элементы массива
Раскрасить при выводе розовым цветом элементы массива, состоящие только из цифр 1, 2, 3 в любых сочетаниях. Uses Crt; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru