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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
cop
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 67
#1

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

24.06.2011, 19:52. Просмотров 1237. Ответов 11
Метки нет (Все метки)

Добрый вечер. прошу по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++):

Циклический сдвиг целого числа на n разрядов влево и вправо - C++
Такая ситуация. Написать функцию, циклически сдвигающую целое число на N разрядов вправо или влево, в зависимости от третьего параметра...

Сформировать массив десятичных цифр числа А. Элементы массива цифр сдвинуть циклически влево на 1 позицию - C++
дано целое десятичное число А. Сформировать массив десятичных цифр числа А. Элементы массива цифр сдвинуть циклически влево на 1 позицию ....

Обеспечить сдвиг столбцов матрицы вправо или влево в зависимости от знака вводимого числа сдвигов - C++
Дана целочисленная матрица размерности n x m. Обеспечить сдвиг столбцов матрицы вправо или влево в зависимости от знака вводимого числа...

Дана целочисленная матрица размерности n x m. обеспечить сдвиг столбцов вправо или влево в зависимости от знака вводимого числа сдвигов k - C++
Здравствуйте помогите с задачей по с++. Дана целочисленная матрица размерности n x m. обеспечить сдвиг столбцов вправо или влево в...

дано натуральное число N. Определить,во сколько раз произведение цифр числа больше суммы цифр.Найти количество чётных цифр в записи числа!! - C++
дано натуральное число N. Определить,во сколько раз произведение цифр числа больше суммы цифр.Найти количество чётных цифр в записи числа!!...

Выполнить все циклические сдвиги слов в заданном тексте влево - C++
Задана в файле строка текста. Выполнить все циклические сдвиги слов в заданном тексте влево. Каждый полученный при этом текст вывести в...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Kastaneda
Форумчанин
Эксперт С++
4518 / 2860 / 228
Регистрация: 12.12.2009
Сообщений: 7,267
Записей в блоге: 2
Завершенные тесты: 1
24.06.2011, 19:56 #2
На сколько я понимаю нужно реализовать сдвиг массива, в чем проблема?
cop
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 67
24.06.2011, 19:59  [ТС] #3
честно говоря не знаю как реализовать.
Kastaneda
Форумчанин
Эксперт С++
4518 / 2860 / 228
Регистрация: 12.12.2009
Сообщений: 7,267
Записей в блоге: 2
Завершенные тесты: 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
Каратель
Эксперт С++
6553 / 3973 / 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
Эксперт С++
1040 / 819 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
25.06.2011, 04:58 #7
Цитата Сообщение от Kastaneda Посмотреть сообщение
На сколько я понимаю нужно реализовать сдвиг массива, в чем проблема?
Не. Все ГОРАЗДО проще.
Сдвиг влево - ДОБАВЛЯЕМ в массив 0.
Сдвиг вправо - удаляем последний элемент.
Для vector - тривиально!
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
25.06.2011, 05:16 #8
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
Для vector - тривиально!
а для остальных memmov придумали
cop
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 67
25.06.2011, 10:42  [ТС] #9
тогда правильный код как будет выглядеть? подскажите пожалуйста
ValeryLaptev
Эксперт С++
1040 / 819 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
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
1250 / 975 / 49
Регистрация: 30.07.2010
Сообщений: 5,297
25.06.2011, 20:15 #11
Насколько я понимаю, это только для типа длинных чисел с основанием 10?
ValeryLaptev
Эксперт С++
1040 / 819 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
25.06.2011, 21:15 #12
Цитата Сообщение от iama Посмотреть сообщение
Насколько я понимаю, это только для типа длинных чисел с основанием 10?
Да, конечно. И я - не проверял...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.06.2011, 21:15
Привет! Вот еще темы с ответами:

Количество делителей длинного числа - C++
Уважаемые знатоки, помогите пожалуйста с задачей на длинную арифметику Задача заключается в том, чтобы найти количество делителей...

Побитовый сдвиг влево и вправо - C++
Что выполнится быстрее - сдвиг влево или сдвиг вправо? И как замерить время выполнения каждой из операций в коде? Добавлено через 2...

Циклический сдвиг массива влево и вправо - C++
Нужно реализовать циклический сдвиг массива влево и вправо! Например есть массив int- {121605}? mass_len=6, нужно чтобы после сдвига...

Осуществить сдвиг влево/ вправо элементов - C++
Разработать подпрограммы (функции или процедуры) для следующих алгоритмов над массивом. Входным параметром подпрограмм является...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
25.06.2011, 21:15
Ответ Создать тему
Опции темы

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