LINUX.ORG.RU

Ответ на: комментарий от bad_master

Вам бы не помешало открыть учебник хотя бы на первой странице, прежде чем писать на Си.

https://ru.wikipedia.org/wiki/Операторы_в_C_и_C%2B%2B#Арифметические_операторы

«Си — инструмент, острый, как бритва: с его помощью можно создать и элегантную программу, и кровавое месиво»

CrossFire ★★★★★
()

Логарифм берёшь и всё, если логарифм по основанию 10, узнаешь количество знаков в десятичной записи, если по основанию 2, то количество двоичных знаков

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
	int a = 40000;
	cout << (int(log2(a)) + 1) << endl << (int(log10(a)) + 1) << endl;
	return 0;
}
AKonia ★★
()
Последнее исправление: AKonia (всего исправлений: 1)
Ответ на: комментарий от AKonia

Ты же в курсе что говно написал? Или ты специально этому тролю так написал? Если нет, то вот тебе пример, как твой код лажает: https://gcc.godbolt.org/z/efeGzc

С double нужно работать думая…

fsb4000 ★★★★★
()

А в какой системе счисления число цифр интересует?

Вот пример задачи https://ibb.co/z2tcHxL

В альпинизме есть понятие «треугольник смерти» - типовая ошибка при блокировке страховочной станции чреватая летальным исходом.

Я второй раз в жизни вижу такой треугольник из ифов, по аналогии хочется назвать его «треугольником прилежного идиота»:-(

AntonI ★★★★
()
Ответ на: комментарий от ilovewindows

И если автор захочет брать модуль, то пусть не забывает про -2147483648.

X512 ★★★★★
()

char*word = new char[25];

Динамическое выделение памяти без особой надобности да ещё и утечка памяти.

X512 ★★★★★
()
Ответ на: комментарий от bad_master

Нехорошую. Перевод в строку для того что бы посчитать кол-во десятичных цифр это из пушки по воробьям. Более того, ты используя плюсы хранишь строку для перевода не как std::string, а как массив char фиксированного размера. Это прям совсем плохо.

Aswed ★★★★★
()
Последнее исправление: Aswed (всего исправлений: 1)
Ответ на: комментарий от X512

Вот ответ

#include <iostream>
#include <cstring>

int main()
{
    long long a = 1000000000000000000;
    long long b = 1000000000000000000-1;
    std::string stra=std::to_string(a);
    std::cout<<stra.size()<<std::endl;
    std::string strb=std::to_string(b);
    std::cout<<strb.size()<<std::endl;
}

bad_master
() автор топика
Ответ на: комментарий от bad_master

Даже так вот лучше

#include <iostream>
#include <cstring>

int main()
{
    long long a = -1000000000000000000;
    long long b = 1000000000000000000-1;
    std::string stra=std::to_string(labs(a));
    std::cout<<stra.size()<<std::endl;
    std::string strb=std::to_string(b);
    std::cout<<strb.size()<<std::endl;
}

bad_master
() автор топика
Последнее исправление: bad_master (всего исправлений: 1)
Ответ на: комментарий от X512

с минусом удобно когда число отрисовываешь графически обычным switch’ом вставляешь шрифт символа или цифры

bad_master
() автор топика
Ответ на: комментарий от CrazyAlex25

Если минус считать за цифру (что в коде явно делается), то похоже на правду.

Только не пробуй -0 вставлять :)

На множестве целых чисел 0 == -0 так что с этим нет проблем. А вот с float/double проблемы бы были и не только с минусом.

X512 ★★★★★
()
Ответ на: комментарий от CrazyAlex25

а вот и нет! все херня, переделывай на битах! ишь, циклами он тут размахался

deep-purple ★★★★★
()
Последнее исправление: deep-purple (всего исправлений: 1)
Ответ на: комментарий от bad_master

пхах! помочь... это скорее тот кто тебя в лужицу тычет - помогает. и я его одобряю.

deep-purple ★★★★★
()
Ответ на: комментарий от bad_master

std::to_string(a);

std::to_string relies on the current locale for formatting purposes

(c) cppreference.com

Результат вполне может оказаться из таких цифр. А с учётом того, что stra.size()

For std::string, the elements are bytes (objects of type char), which are not the same as characters if a multibyte encoding such as UTF-8 is used.

Результат может не совпадать с количеством символов в многобайтных кодировках.

X512 ★★★★★
()
Ответ на: комментарий от AKonia

Логарифм берёшь и всё

Только если размерность позволяет посчитать его без ошибки. Скажем, на 64битных числах логарифм в double не поканает. А хотя может и поканает, только нужно очень хорошо подумать о невозможности точного представления степеней 10-ки и режимах округления (fesetround(3)).

если по основанию 2, то количество двоичных знаков

Двоичный делается через несколько битовых операций. Гуглить что-то типа bitwise magic, там целая статья про алгоритмы подсчёта единиц, значащих бит, leftmost/rightmost set bit и т.д.

slovazap ★★★★★
()
Ответ на: комментарий от bad_master

Если учитывать знак, то 20. Если тебе знак не нужен то убери

    if(a<0)
        i++;
CrazyAlex25 ★★★
()

#include <iostream>
#include <cmath>

int main() 
{ 
    long long num = 9223372036854775807;
    int res = (num == 0) ? 1 : (log10(num) + 1);
    std::cout << res;
    return 0; 
}

правда только для положительных чисел, ну такое.

bhfq ★★★★★
()
Последнее исправление: bhfq (всего исправлений: 1)
Ответ на: комментарий от ilovewindows

Не вижу проблемы, число как число:
8000000000000000(16) = -9223372036854775808(10)

bormant ★★★★★
()

Ты этот вопрос будешь задавать на каждом найденном форуме/QA-сайте?

Модеры, мож сразу забаните этого спамера? Я этот вопрос сегодня уже видел на тостере (и не удивлюсь если легко найду его еще паре-тройке околоайтишных форумов)

RiseOfDeath ★★★★
()
Последнее исправление: RiseOfDeath (всего исправлений: 5)
Ответ на: комментарий от X512

так ты число подставил которое больше или меньше long long max или min

bad_master
() автор топика
Ответ на: комментарий от bhfq

есть еще вариант с функцией lltoa но я х3 какую библиотеку надо прилинковать в линуксе чтобы скомпилировать

#include <iostream>
#include <cstdlib>
int main()
{
   long long a = 100;
char*c= new char[100];
lltoa(a, c, 10) ;
std::cout<<c<<std::endl;
}
bad_master
() автор топика
Последнее исправление: bad_master (всего исправлений: 2)

Однако, уже 47 каментов! Вижу, за задачу взялись ответственно, всем ЛОРом. Ну как, решили или ещё нет?

aureliano15 ★★
()

Можно найти двоичный логарифм, а потом под нужное основание перевести заранее заготовленной константой. Кажется это быстрее всего…

OxiD ★★★★
()
Ответ на: комментарий от OxiD

Точнее взять целую часть двоичного логарифма.

Остальное можно вообще заранее просчитать- надо всего 64 записи.

OxiD ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.