Форум программистов, компьютерный форум CyberForum.ru

Определить разрядность числа - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 61, средняя оценка - 4.75
King_IgorEfimoV
 Аватар для King_IgorEfimoV
1 / 1 / 0
Регистрация: 18.04.2011
Сообщений: 9
05.07.2011, 08:25     Определить разрядность числа #1
Добрый день, написал функцию для определения разрядности числа, однако отказывается работать.
Подправте кто соблаговолит, либо предложите альтернативный вариант.
C++
1
2
3
4
5
6
7
8
9
10
int searchrazryad(long int N)
{
int razryad=0;
for (N%10>10;)
    N/10;
        razryad+=1;
        printf("Kolichestvo razrayadov = %d", &razryad);
 
return razryad;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryLaptev
Эксперт C++
1004 / 783 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
05.07.2011, 08:30     Определить разрядность числа #2
Ну хоть книжку-то почитай, как на С++ пишется...
C++
1
2
3
4
5
int i = 0; 
while(N>0)
{ N = N / 10; ++i;
}
cout << i << endl;
King_IgorEfimoV
 Аватар для King_IgorEfimoV
1 / 1 / 0
Регистрация: 18.04.2011
Сообщений: 9
05.07.2011, 08:32  [ТС]     Определить разрядность числа #3
не подскажите еще случаем, как это в виде функции оформить? ( .h )
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
05.07.2011, 08:38     Определить разрядность числа #4
ValeryLaptev, а как же отрицательные числа?
C++
1
2
3
4
5
6
size_t capacity(int n){
    size_t i = 0;
    for (; n ; n /= 10)
        ++i;
    return i;
}
Bogdan1986
0 / 0 / 0
Регистрация: 10.11.2015
Сообщений: 4
10.11.2015, 13:48     Определить разрядность числа #5
все работает, определяет разрядность 32 разрядного числа и делит и находит (2^30)/x


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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
int x=1024; 
int a=x; 
int n=0; 
int b=0; 
int sum=0; 
int c=1; 
int sum2=0; 
 
 
 
 
if((16)>0) 
{ 
a=(16); 
n=n+16; 
} 
if((8)>0) 
{ 
a=(8); 
n=n+8; 
} 
if((4)>0) 
{ 
a=(4); 
n=n+4; 
} 
if((2)>0) 
{ 
a=(2); 
n=n+2; 
} 
if((1)>0) 
{ 
a=(1); 
n=n+1; 
} 
if(a==1) 
{ 
a=(1); 
n=n+1; 
} 
 
b=(30-n); 
c=(30-n); 
 
for(int i=0;i<(30-n);i++) 
{ 
 
if(1073741824-(sum+b)>0) 
{ 
sum=b+sum; 
sum2=c+sum2; 
} 
 
b=1; 
c=1; 
 
} 
 
 
System.out.println(sum2); 
System.out.println(n);
Добавлено через 28 минут
будем добавлять до миллиона скажем
14 - 0 сумма 999 982
28 - 0 сумма 999 982
56 - 1 сумма 999 982
112-0 сумма 999 926
224-0 сумма 999 926
448-0 сумма 999 926
896 -0 сумма 999 926
1792-0 сумма 999 926
3584 -1 сумма 996342 + 3584 = 999 926
7168 -1 сумма 989 174+7168 = 996 342
14 336 - 1 сумма 974 838+14 336 = 989 174
28 672 -0
57 334 - 1 сумма 917 504+57 334=974 838
114 688 - 0
229 376 - 0
458 752 - 0 сумма 917 504 так как 917 504+458 752 больше миллиона
917 504 - 1 сумма 917 504
1 835 008 - 0 число уже больше милиона сумма 0

итак смотрите снизу вверх
получаем число
10001011100000100 - вот такое вот число
переведем его из двоичного в десятиричное
получили число 71 428
и теперь если умножить 71 428 на 14 получим 999 992
с точностью до шестого знака
и при таких вычислениях мы не применяли умножений только суммы
и разности
ishellstrike
77 / 13 / 7
Регистрация: 23.10.2015
Сообщений: 83
10.11.2015, 15:15     Определить разрядность числа #6
к слову самый быстрый способ узнать число десятичных цифр -- это сравнить по-очереди с числами 9, 99, 999, 9999... Если речь не идет о каких-то специфических процессорах
Dimension
Dimension
547 / 428 / 132
Регистрация: 08.04.2014
Сообщений: 1,693
Завершенные тесты: 1
10.11.2015, 15:23     Определить разрядность числа #7
спустя 4 года британские ученые нашли ответ на вопрос King_IgorEfimoV

Добавлено через 1 минуту
Цитата Сообщение от ishellstrike Посмотреть сообщение
к слову самый быстрый способ узнать число десятичных цифр
думаю взять десятичный логарифм от числа быстрее
Bogdan1986
0 / 0 / 0
Регистрация: 10.11.2015
Сообщений: 4
10.11.2015, 16:04     Определить разрядность числа #8
Вобщето нет , для 32 разрядного числа как видишь 6 проверок
а для 64 разрядного будет 7
посмотри внимательнее этот способ куда быстрее чем проверять 9 , 99 ...
так как у 64 разрядного числа уже 19 знаков , а значит надо будет целых 19 проверок
в то время как в моем случае это будет всего 7

Добавлено через 1 минуту
да и не всегда нужно проверять разрядность именно десятичного, чаще нужно проверить именно двоичную разрядность

Добавлено через 12 минут
ты даже не обратил внимание на тот факт что тут произведено деление 16 разрядного числа помещенного в 32 разрядное
1 умножение +100 сумм = 132 суммы
16*16=256 т.е. разница в 2 и больше раз, да и точность в 32 разряда не малая
для простых процессоров таких как на видеокарте это ускорит паралельное деление в 2 раза для 32 разрядных
чисел где применяется только 16 разрядов
А если взять 64 разрядный процессор там 20 знаков есть место для шага
Число сумм возростет вдвое витоге это будет 164 суммы для 32 разрядов из 64
а 32*32 = 1024
1024/164 = 6.24 раз ускориться, это огромные числа с огромной точностью и в 6 раз быстрее
pproger
162 / 65 / 13
Регистрация: 22.03.2011
Сообщений: 188
10.11.2015, 16:30     Определить разрядность числа #9
King_IgorEfimoV,
C++
1
cout << to_string(abs(number)).length() << endl;
Bogdan1986
0 / 0 / 0
Регистрация: 10.11.2015
Сообщений: 4
10.11.2015, 16:34     Определить разрядность числа #10
да кстати я чета перебрал с суммами где их и не надо было
я еще подускорил алгоритм
Java
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
int x=23876;
        int a=x;
        int n=0;
        int b=0;
        int sum=0;
        int c=1;
        int sum2=0;
        int k;
        
        
        
 
        if((a>>16)>0)
        {
        a=(a>>16);  
        n=n+16;
        }
        if((a>>8)>0)
        {
        a=(a>>8);   
        n=n+8;
        }
        if((a>>4)>0)
        {
        a=(a>>4);   
        n=n+4;
        }
        if((a>>2)>0)
        {
        a=(a>>2);   
        n=n+2;
        }
        if((a>>1)>0)
        {
        a=(a>>1);   
        n=n+1;
        }
        if(a==1)
        {
        a=(a>>1);   
        n=n+1;
        }
        
        b=x<<(30-n);
        c=c<<(30-n);
        
        for(int i=0;i<(30-n);i++)
        {
            
        if(1073741824-(k=sum+b)>0)  
        {
        sum=k;  
        sum2=c|sum2;
        }   
        
        b=b>>1; 
        c=c>>1;
        
        }
        
        
        System.out.println(sum2);
        System.out.println(n);
ishellstrike
77 / 13 / 7
Регистрация: 23.10.2015
Сообщений: 83
10.11.2015, 16:51     Определить разрядность числа #11
Bogdan1986, Dimension, а вот и не быстрее
Dimension
Dimension
547 / 428 / 132
Регистрация: 08.04.2014
Сообщений: 1,693
Завершенные тесты: 1
10.11.2015, 17:08     Определить разрядность числа #12
ishellstrike, статья с 13 минусами меня не впечатляет
ishellstrike
77 / 13 / 7
Регистрация: 23.10.2015
Сообщений: 83
10.11.2015, 17:20     Определить разрядность числа #13
Dimension, в таком случае рекомендую самостоятельные тесты
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.11.2015, 18:21     Определить разрядность числа
Еще ссылки по теме:

C++ Определить, все ли числа являются положительными или положительные числа чередуются с отрицательными
Определить цифры целого числа (тип числа - целое без знака) C++
C++ Cygwin на windows и разрядность

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

Или воспользуйтесь поиском по форуму:
Bogdan1986
0 / 0 / 0
Регистрация: 10.11.2015
Сообщений: 4
10.11.2015, 18:21     Определить разрядность числа #14
если ты хочешь только разрядность найти а 1/x не нужен то тебе только вот эта часть кода нужна
Java
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
44
45
int x=23876;
int a=x;
int n=0;
 
 
 
 
 
if((16)>0)
{
a=(16); 
n=n+16;
}
if((8)>0)
{
a=(8); 
n=n+8;
}
if((4)>0)
{
a=(4); 
n=n+4;
}
if((2)>0)
{
a=(2); 
n=n+2;
}
if((1)>0)
{
a=(1); 
n=n+1;
}
if(a==1)
{
a=(1); 
n=n+1;
}
 
 
 
 
 
 
System.out.println(n);
Yandex
Объявления
10.11.2015, 18:21     Определить разрядность числа
Ответ Создать тему
Опции темы

Текущее время: 20:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru