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

сдвиги длинного числа влево и вправо на заданное количество цифр - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
cop
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 67
24.06.2011, 19:52     сдвиги длинного числа влево и вправо на заданное количество цифр #1
Добрый вечер. прошу поmощи в реализации программы.
BigInteger.Используя перегрузку операторов, реализовать :
сдвиги длинного числа влево и вправо на заданное количество цифр
// (сдвиг вправо - деление на степень 10, влево - умножение)
friend BigInteger operator <<(const BigInteger& x, int y);
friend BigInteger operator >>(const BigInteger& x, int y);
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.06.2011, 19:52     сдвиги длинного числа влево и вправо на заданное количество цифр
Посмотрите здесь:

C++ Количество делителей длинного числа
C++ Реакция на нажатие клавиш (вверх, вниз, влево, вправо)
Циклический сдвиг массива влево и вправо C++
Осуществить сдвиг влево/ вправо элементов C++
C++ Дана целочисленная матрица размерности n x m. обеспечить сдвиг столбцов вправо или влево в зависимости от знака вводимого числа сдвигов k
C++ Обеспечить сдвиг столбцов матрицы вправо или влево в зависимости от знака вводимого числа сдвигов
C++ Сформировать массив десятичных цифр числа А. Элементы массива цифр сдвинуть циклически влево на 1 позицию
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4247 / 2779 / 219
Регистрация: 12.12.2009
Сообщений: 7,109
Записей в блоге: 1
Завершенные тесты: 1
24.06.2011, 19:56     сдвиги длинного числа влево и вправо на заданное количество цифр #2
На сколько я понимаю нужно реализовать сдвиг массива, в чем проблема?
cop
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 67
24.06.2011, 19:59  [ТС]     сдвиги длинного числа влево и вправо на заданное количество цифр #3
честно говоря не знаю как реализовать.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4247 / 2779 / 219
Регистрация: 12.12.2009
Сообщений: 7,109
Записей в блоге: 1
Завершенные тесты: 1
24.06.2011, 20:07     сдвиги длинного числа влево и вправо на заданное количество цифр #4
Покажи свой класс.
cop
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 67
24.06.2011, 20:10  [ТС]     сдвиги длинного числа влево и вправо на заданное количество цифр #5
мои попытки.
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include <iostream>
#include <string>
 
class BigInteger
{
public:
    // максимальное количество цифр в числе
    static const int MAXLEN = 100;
 
private:
    // указатель, по которому будет расположен динамический массив с цифрами
    char* ar;
 
public:
    // конструктор по 32-х битному числу (по умолчанию 0)
    BigInteger(int val = 0)
    {
        ar = new char[MAXLEN];
        for (int i = 0; i < MAXLEN; i++)
        {
            ar[i] = (char) (val % 10);
            val /= 10;
        }
    }
 
    // конструктор по строке
    BigInteger(const string& str)
    {
        ar = new char[MAXLEN];
        for (int i = 0; i < MAXLEN; i++)
        {
            int k = (int) str.size() - 1 - i;
            ar[i] = (k >= 0) ? str[k] - '0' : 0;
        }
    }
 
    // конструктор копирования
    BigInteger(const BigInteger& big)
    {
        ar = new char[MAXLEN];
        memcpy(ar, big.ar, MAXLEN);
    }
 
    BigInteger& operator =(const BigInteger& big)
    {
        // отсекаем присваивание самому себе
        if (this == &big)
            return *this;
 
        // копируем данные
        memcpy(ar, big.ar, MAXLEN);
 
        return *this;
    }
 
    ~BigInteger()
    {
        delete ar;
    }
 
    // преобразование в строку
    void ToString(string& res) const
    {
        int k = MAXLEN - 1;
        while (k >= 0 && !ar[k])
            k--;
 
        if (k < 0)
        {
            res = "0";
            return;
        }
 
        res.clear();
        for (; k >= 0; k--)
            res += '0' + ar[k];
 
 
BigInteger operator<<(size_t number_of_digits)
{
    string result;
 
    ToString(result);
 
    size_t len = result.length();
 
    for (size_t n = 0; n < number_of_digits; ++n)
    {
        char first = result[0];
 
        for (size_t i = 1; i < len; ++i)
            result[i - 1] = result[i];
 
        result[len - 1] = first;
    }
 
    return BigInteger (result);
}
 
BigInteger operator>>(size_t number_of_digits)
{
    string result;
 
    ToString(result);
 
    size_t len = result.length();
 
    for (size_t n = 0; n < number_of_digits; ++n)
    {
        char last = result[len - 1];
 
        for (size_t i = len - 1; i > 0; --i)
            result[i] = result[i - 1];
 
        result[0] = last;
    }
 
    return BigInteger (result);
}
 Комментарий модератора 
Используйте теги форматирования кода!
Jupiter
Каратель
Эксперт C++
6545 / 3965 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
25.06.2011, 03:01     сдвиги длинного числа влево и вправо на заданное количество цифр #6
навскидку
1. использовать char для таких вещей не эффективно
2. на каждый new [] длжен быть и delete []
C++
1
2
3
4
~BigInteger()
{
    delete ar;
}
3. перегрузку >> и << следует сделать константной
4. раз уж используете std::string так и используйте std::rotate для сдвигов
ValeryLaptev
Эксперт С++
1010 / 789 / 46
Регистрация: 30.04.2011
Сообщений: 1,599
25.06.2011, 04:58     сдвиги длинного числа влево и вправо на заданное количество цифр #7
Цитата Сообщение от Kastaneda Посмотреть сообщение
На сколько я понимаю нужно реализовать сдвиг массива, в чем проблема?
Не. Все ГОРАЗДО проще.
Сдвиг влево - ДОБАВЛЯЕМ в массив 0.
Сдвиг вправо - удаляем последний элемент.
Для vector - тривиально!
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
25.06.2011, 05:16     сдвиги длинного числа влево и вправо на заданное количество цифр #8
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
Для vector - тривиально!
а для остальных memmov придумали
cop
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 67
25.06.2011, 10:42  [ТС]     сдвиги длинного числа влево и вправо на заданное количество цифр #9
тогда правильный код как будет выглядеть? подскажите пожалуйста
ValeryLaptev
Эксперт С++
1010 / 789 / 46
Регистрация: 30.04.2011
Сообщений: 1,599
25.06.2011, 19:43     сдвиги длинного числа влево и вправо на заданное количество цифр #10
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;        // -- лучше писать префикс std:: для каждого системного имени
 
class BigInteger
{
public:
        // максимальное количество цифр в числе
        static const int MAXLEN = 100;
 
private:
        // указатель, по которому будет расположен динамический массив с цифрами
        //char* ar;
        vector<char> ar;            // -- вектор цифр --
        // -- младшая цифра по младшему индексу --
        
public:
        // конструктор по 32-х битному числу (по умолчанию 0)
        BigInteger(int val = 0)
        {
                // ar = new char[MAXLEN]();         // -- сразу и обнулили --
                // for (int i = 0; i < MAXLEN; i++)
                if(val == 0) ar.push_back(0);
                else
                while(val > 0)
                {
                        ar.push_back(val % 10));
                        val /= 10;
                }
        }
 
        // конструктор по строке
        BigInteger(const string& str)
        {
                // ar = new char[MAXLEN]();
                //for (int i = 0; i < MAXLEN; i++)
                for (size_t i = 0; i < str.size(); i++)
                {
                        size_t k = str.size() - 1 - i;
                        ar.push_back(str[k] - '0');
                }
        }
 
        // конструктор копирования -- можно не писать! --
        BigInteger(const BigInteger& big)
        {
                //ar = new char[MAXLEN];
                //memcpy(ar, big.ar, MAXLEN);
                ar = big.ar;
        }
        // -- можно не писать --
        // -- но в вашем коде лучше так сделать -- 
        BigInteger& operator =(const BigInteger& big)
        {
                // отсекаем присваивание самому себе
                if (this != &big)
                  memcpy(ar, big.ar, MAXLEN);     // копируем данные
 
                return *this;
        }
        // -- можно не писать --
        ~BigInteger()
        {
                delete []ar;    // -- так правильно возвращать память для массива --
        }
 
        // преобразование в строку
        void ToString(string& res) const
        {
                int k = MAXLEN - 1;
                while (k >= 0 && !ar[k])
                        k--;
 
                if (k < 0)
                {
                        res = "0";
                        return;
                }
 
                res.clear();
                for (; k >= 0; k--)
                        res += '0' + ar[k];
        }
// -- можно проще сделать -- и для вашего кода тоже --
string ToString() const
{  string res;
   for(size_t i = 0; i < ar.size(); ++i)
      res += ('0' + ar[k]);
   reverse(res.begin(), res.end()); //-- надо ли переворачиквть - нужно подумать          
   return res;
} 
        
BigInteger operator<<(size_t number_of_digits)
{
    string result = ToString();     // -- строка - перевернута!
     //ToString(result);
 //    size_t len = result.length();
 /*
    for (size_t n = 0; n < number_of_digits; ++n)
    {
        char first = result[0];
 
        for (size_t i = 1; i < len; ++i)
            result[i - 1] = result[i];
 
        result[len - 1] = first;
    }
 */
 result = result + '0';         // сдвинули влево - добавили младший ноль!
    return BigInteger (result);
}
 
BigInteger operator>>(size_t number_of_digits)
{
    string result = ToString();
 //   ToString(result);
 /*
    size_t len = result.length();
 
    for (size_t n = 0; n < number_of_digits; ++n)
    {
        char last = result[len - 1];
 
        for (size_t i = len - 1; i > 0; --i)
            result[i] = result[i - 1];
 
        result[0] = last;
    }
 */
 result = result.substr(1);     // -- отрезаем младший символ --
    return BigInteger (result);
}
iama
 Аватар для iama
1249 / 974 / 48
Регистрация: 30.07.2010
Сообщений: 5,297
25.06.2011, 20:15     сдвиги длинного числа влево и вправо на заданное количество цифр #11
Насколько я понимаю, это только для типа длинных чисел с основанием 10?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.06.2011, 21:15     сдвиги длинного числа влево и вправо на заданное количество цифр
Еще ссылки по теме:

Сдвинуть элементы на одну позицию вправо\влево C++
C++ Нужно сдвинуть число на 4 разряда влево и вправо
C++ Побитовый сдвиг влево и вправо
Выполнить все циклические сдвиги слов в заданном тексте влево C++
Циклический сдвиг целого числа на n разрядов влево и вправо C++

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

Или воспользуйтесь поиском по форуму:
ValeryLaptev
Эксперт С++
1010 / 789 / 46
Регистрация: 30.04.2011
Сообщений: 1,599
25.06.2011, 21:15     сдвиги длинного числа влево и вправо на заданное количество цифр #12
Цитата Сообщение от iama Посмотреть сообщение
Насколько я понимаю, это только для типа длинных чисел с основанием 10?
Да, конечно. И я - не проверял...
Yandex
Объявления
25.06.2011, 21:15     сдвиги длинного числа влево и вправо на заданное количество цифр
Ответ Создать тему
Опции темы

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