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

Разложение больших целых чисел на простые множители - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Перегрузка операторов в классе http://www.cyberforum.ru/cpp-beginners/thread1165298.html
Здравствуйте. Написал класс: template <class T> class LIST { private: T* listP; uint lSize; public:
C++ Описать структуру STUDENT Прошу помощи, уважаемые программисты! Я гуманитарий, задание для меня, конечно, очень интересное, но и очень непонятное. Как в коде С++ можно вывести список, да еще и упорядочить?! Может кто поможет мне. Задание: описать структуру с именем STUDENT, содержащую следующие поля: а)фамилия и имя(строка 15 символов), б) год рождения(целое неотриц. число), в)номер группы( число целое или строка... http://www.cyberforum.ru/cpp-beginners/thread1165275.html
C++ Инициализация static члена класса
Добрый вечер! Есть класс, в нём в private реализован ещё один + это всё шаблоны. Во вложенном классе есть static указатель на переменную типа этого вложенного класса. Вопрос - как инициализировать эту переменную и возможно ли это? Если нет или если есть вариант по проще, как сделать nilPtr, что бы на неё в моём дереве указывали все листья, то буду очень благодарен решению. enum colors {black...
C++ Посчитать интеграл методом трапеций
нужно посчитать интеграл по формуле трапеции с точность e=0.001 и шагом n=10 \int_{0}^{\pi /2}\sqrt{1+sin^2(x)}dx \int_{a}^{b}f(x)dx=\frac{b-a}{2*(n-1)}*\left -формула трапеции
C++ Помогите переписать из Паскаля на С++ http://www.cyberforum.ru/cpp-beginners/thread1165252.html
Помогите переписать из Паскаля на С++ var j,i:integer; N:integer; Max:real; a,b:real; Mas: array of real; begin write('Введите N ( N < 100):'); readln(N); write('Введите a:'); readln(a);
C++ Динамическое подключение DLL Здравствуйте! Скорее всего, мой вопрос покажется вам глупым, но всё же... Я не могу динамически подключить библиотеку. Когда подключаю статически, всё работает, функция выдает ответ и все счастливы. Но когда начинаю подключать статически, в момент вызова функции программа ломается, выдавая: Необработанное исключение по адресу 0x776B1A91 в DetCalcDynamic.exe: 0xC0000005: нарушение прав доступа при... подробнее

Показать сообщение отдельно
Archi0
28 / 14 / 4
Регистрация: 18.07.2013
Сообщений: 166
07.05.2014, 16:00     Разложение больших целых чисел на простые множители
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Prime
{
public:
    static const unsigned __int16 prime[];
    static bool IsPrime(__int32);
/********************************************
формат результата (знак числа)делитель -кратность +следующий делитель -кратность ...
отрицательные числа означающие кратность могут опускаться если множитель входит единожды
формат результата (знак числа)делитель +следующий делитель -кратность ...
максимум может понадобиться 13 чисел для описания факторизации числа __int32
функция возвращает false для -1 0 1 которые не может разложить никак не меняя значения
по указателю __int32*
********************************************/
    static bool Prime::factorization (__int32 num, __int32* rez);
    Prime(void);
    ~Prime(void);
};
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
const unsigned __int16 Prime::prime[4793] = {
    2,3,...их тут много...,46337,1
};
 
Prime::Prime(void)
{
}
 
Prime::~Prime(void)
{
}
 
bool Prime::IsPrime(__int32 num)
{
    if (num<4 && num>-4 && num!=0) return true; // отсеяны числа -3 -2 -1 1 2 3
    if ((num&1)==0) return false; // отсеяны все чётные и 0 кроме -2 2
    if (num%3==0) return false; // отсеяны все кратные 3 кроме -3 3
    //66.67% чисел отсеяно
    __int32  probationer = num<0?-num:num;
    if (probationer <= prime[4791])
    {
        int i;
        int j;
        //первое деление секции не симметричное так как маленькие простые числа встречаются чаще.
        if(probationer>330) 
        {
            i=67;
            j=4790;
            if (probationer==331 || probationer==46337) return true;
        }
        else 
        {
            i=3;
            j=64;
            if (probationer==5 || probationer == 317) return true;
        }
        //поиск числа в массиве
        while (i<j)
        {
            int m = (i+j)>>1;
            unsigned __int16 p = prime[m];
            if(probationer==p) return true;
            if(probationer>p) i=++m; else j=--m;
        }
        return probationer==prime[i];
    }
    else
    {
        const unsigned __int16* p= &prime[2];//массив должен заканчиваться на 1
        while (true) 
        {
            if (probationer%*p==0) {//данная операция служит заодно и проверкой на конец массива
                if (*p==1) return true; else return false;
            }
            else
            {
                if (*p**p>probationer) return true;
            }
            p++;
        }
    }
}
 
 bool Prime::factorization (__int32 num, __int32* rez) 
 {
     if (num<1 && num>-1 ) return false; 
     __int32  probationer = num<0?-num:num;
     const unsigned __int16* p= prime;
     __int32* prez = rez;
     while (*p!=1) 
    {
        int count =0;
        if (probationer%*p==0)
        {
            probationer/=*p;
            --count;
            *prez++=*p;
            while(probationer%*p==0)
            {
                probationer/=*p;
                --count;
            }
            if (count<-1) *prez++ = count;
        }
        else
        {
            if (*p**p>probationer) // в данной ситуации сам probationer это последний делитель и его кратность равна 1
            {
                if(probationer!=1) *prez = probationer;
                if (num>0) return true; else {*rez = -*rez; return true;}
            }
            else
            {
                p++;
            }
        }
    }
    //  простое число по модулю большее чем 2147117570 например 2^31-1
    *rez=num; return true;
 }
 
Текущее время: 12:28. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru