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

Длинная арифметика. Сложение - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Генерация случайных чисел http://www.cyberforum.ru/cpp-beginners/thread1113574.html
Здравствуйте, появилась такая проблема: при генерации случайного числа функцией rand(); мне нужно сгенерировать 5 случайных чисел, но они все одинаковые, если написать вот так: srand(time(NULL)); то числа будут меняться только при перезапуске, но всё равно все будут одинаковые
C++ Вывод результата поиска Программа считывает из файла данные, потом осуществляет поиск по Id - номеру и должна вывести строку с Id, именем, фамилией и пр., но в итоге выводит только строку, в которой есть Id, а остальных данных нет. Не пойму в чем дело, очень прошу помочь. #include <stdlib.h> // (exit) #include <string.h> #include <iostream> // (cout, cin) #include <fstream> //работа с фаилами #include... http://www.cyberforum.ru/cpp-beginners/thread1113567.html
Считать данные из файла в буферную переменную C++
На форуме советуют не возиться с потоками данных файла, т.к. намного эффективнее считать сразу весь файл в буферную переменную. Собственно, что это значит, и как это реализовать? Приведите пример, если можно.
C++ R6025 pure virtual function call при вызове метода, реализованного в дочернем классе
Всем привет. Вот такая ошибка у меня возникает при вызове метода, который реализован в дочернем классе, но потом он почему-то становится нереализованным. Проблема заключается, как я полагаю в приведении типов, но как ее избежать. void AbstractTask::start() { CreateThread(NULL, 0, StaticThreadStart, (void*) this, 0, &myThreadId); } DWORD WINAPI AbstractTask::StaticThreadStart(void*...
C++ Алгоритм бензовозов http://www.cyberforum.ru/cpp-beginners/thread1113538.html
Могли бы вы подсказать, как оптимально реализовать алгоритм? Никак не могу придумать (( Отправка бензовозов Исходные данные: Есть АЗС с резервуарами разной емкости и разными видами топлива (92,95, ДТ). Есть бензовоз с разными отсеками и с разными видами топлива. Бензовоз может сливать все отсеки в один резервуар, может слить несколько отсеков в один резервуар, а несколько в других, может...
C++ If - *массив ( у кого есть время ) #include <stdio.h> #include <conio.h> #include<iostream> #include "windows.h" using namespace std; int main() { int **a,n; cout<<"Vvedite n: "; подробнее

Показать сообщение отдельно
vlad_light
4 / 4 / 0
Регистрация: 24.09.2012
Сообщений: 178
07.03.2014, 23:52     Длинная арифметика. Сложение
Есть класс BigInt со скрытыми переменными uint32* m_integer и uint32 m_length, которые отвечают за само число и его длину соответственно. Я реализовал оператор +. Укажите, пожалуйста, на ошибки в реализации (кроме <cstring>) -- как можно было сделать лучше (быстрее)?
Кликните здесь для просмотра всего текста
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
BigInt BigInt::operator+(const BigInt& rhs) const
{
    if (m_length == 0 || rhs.m_length == 0)
        throw "Empty number in BigInt::operator+";
    
    BigInt result;
 
    if (m_length == rhs.m_length)
    {       
        result.m_integer = new uint32[m_length + 1];
        result.m_length = m_length + 1;
        memset(result.m_integer, 0x0, (m_length + 1) * sizeof(uint32));
 
        for (uint32 i = 0; i < m_length; ++i)
        {
            result.m_integer[i] += m_integer[i] + rhs.m_integer[i];
            if (result.m_integer[i] < m_integer[i])
                ++result.m_integer[i + 1];
        }
 
        return result;
    }
 
    if (m_length > rhs.m_length)
    {
        result.m_integer = new uint32[m_length + 1];
        result.m_length = m_length + 1;
        memset(result.m_integer, 0x0, (m_length + 1) * sizeof(uint32));
 
        for (uint32 i = 0; i < rhs.m_length; ++i)
        {
            result.m_integer[i] += m_integer[i] + rhs.m_integer[i];
            if (result.m_integer[i] < m_integer[i])
                ++result.m_integer[i + 1];
        }
 
        for (uint32 i = rhs.m_length; i < m_length; ++i)
        {
            if (result.m_integer[i] == 0)
            {
                memcpy(&result.m_integer[i], &m_integer[i], (m_length - i) * sizeof(uint32));
                break;
            }
            else
            {
                result.m_integer[i] = m_integer[i] + 1;
                if (result.m_integer[i] == 0)
                    ++result.m_integer[i + 1];
            }
        }
    }
    else
    {
        result.m_integer = new uint32[rhs.m_length + 1];
        result.m_length = rhs.m_length + 1;
        memset(result.m_integer, 0x0, (rhs.m_length + 1) * sizeof(uint32));
 
        for (uint32 i = 0; i < m_length; ++i)
        {
            result.m_integer[i] += m_integer[i] + rhs.m_integer[i];
            if (result.m_integer[i] < m_integer[i])
                ++result.m_integer[i + 1];
        }
 
        for (uint32 i = m_length; i < rhs.m_length; ++i)
        {
            if (result.m_integer[i] == 0)
            {
                memcpy(&result.m_integer[i], &rhs.m_integer[i], (rhs.m_length - i) * sizeof(uint32));
                break;
            }               
            else
            {
                result.m_integer[i] = rhs.m_integer[i] + 1;
                if (result.m_integer[i] == 0)
                    ++result.m_integer[i + 1];
            }
        }
    }
    
    return result;
}

Заранее благодарен!

Добавлено через 4 часа 48 минут
Гляньте за одно ещё и квадрат, пожалуйста! Почти уверен, что можно сделать ещё быстрее
Кликните здесь для просмотра всего текста
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
BigInt BigInt::operator*(const BigInt& rhs) const
{
    if (m_length == 0 || rhs.m_length == 0)
        throw "Empty number in BigInt::operator*";
 
    BigInt result;
 
    result.m_integer = new uint32[m_length + rhs.m_length];
    result.m_length = m_length + rhs.m_length;
    memset(result.m_integer, 0x0, (m_length + rhs.m_length) * sizeof(uint32));
 
    for (uint32 i = 0; i < m_length; ++i)
    {
        uint32 carry = 0;
 
        for (uint32 j = 0; j < rhs.m_length; ++j)
        {
            uint64 temp = ((uint64)m_integer[i] * rhs.m_integer[j]) + result.m_integer[i + j] + carry;
            result.m_integer[i + j] = (uint32)temp;
            carry = (uint32)(temp >> 32);
        }
 
        result.m_integer[i + rhs.m_length] = carry;
    }
 
    return result;
}
 
BigInt BigInt::sqr() const
{
    if (m_length == 0)
        throw "Empty number in BigInt::sqr";
 
    BigInt result;
 
    result.m_integer = new uint32[m_length << 1];
    result.m_length = m_length << 1;
    memset(result.m_integer, 0x0, (m_length << 1) * sizeof(uint32));
 
    // cross-products
    for (uint32 shift = 1; shift < m_length; ++shift)
    {
        uint32 carry = 0;
 
        for (uint32 i = 0; i < (m_length - shift); ++i)
        {
            uint64 temp = ((uint64)m_integer[i] * m_integer[i + shift]) + result.m_integer[shift + (i << 1)] + carry;
            result.m_integer[shift + (i << 1)] = (uint32)temp;
 
            temp >>= 32;
            result.m_integer[shift + (i << 1) + 1] += temp;
            if (result.m_integer[shift + (i << 1) + 1] < temp)
                carry = 1;
            else
                carry = 0;
        }
    }
 
    // shift
    for (uint32 i = result.m_length - 1; i > 0; --i)
    {
        result.m_integer[i] <<= 1;
        result.m_integer[i] |= result.m_integer[i - 1] >> 31;
    }
 
    // squares
    uint32 carry = 0;
    for (uint32 i = 0; i < m_length; ++i)
    {
        uint64 temp = ((uint64)m_integer[i] * m_integer[i]) + result.m_integer[i << 1] + carry;
        result.m_integer[i << 1] = (uint32)temp;
 
        temp >>= 32;
        result.m_integer[(i << 1) + 1] += temp;
        if (result.m_integer[(i << 1) + 1] < temp)
            carry = 1;
        else
            carry = 0;
    }
 
    return result;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 21:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru