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

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

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

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

24.06.2011, 19:52. Просмотров 1219. Ответов 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     сдвиги длинного числа влево и вправо на заданное количество цифр
Посмотрите здесь:
Циклический сдвиг целого числа на n разрядов влево и вправо C++
C++ Сформировать массив десятичных цифр числа А. Элементы массива цифр сдвинуть циклически влево на 1 позицию
C++ Обеспечить сдвиг столбцов матрицы вправо или влево в зависимости от знака вводимого числа сдвигов
C++ Дана целочисленная матрица размерности n x m. обеспечить сдвиг столбцов вправо или влево в зависимости от знака вводимого числа сдвигов k
C++ дано натуральное число N. Определить,во сколько раз произведение цифр числа больше суммы цифр.Найти количество чётных цифр в записи числа!!
Выполнить все циклические сдвиги слов в заданном тексте влево C++
C++ Количество делителей длинного числа
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Форумчанин
Эксперт С++
4479 / 2841 / 226
Регистрация: 12.12.2009
Сообщений: 7,222
Записей в блоге: 1
Завершенные тесты: 1
24.06.2011, 19:56     сдвиги длинного числа влево и вправо на заданное количество цифр #2
На сколько я понимаю нужно реализовать сдвиг массива, в чем проблема?
cop
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 67
24.06.2011, 19:59  [ТС]     сдвиги длинного числа влево и вправо на заданное количество цифр #3
честно говоря не знаю как реализовать.
Kastaneda
Форумчанин
Эксперт С++
4479 / 2841 / 226
Регистрация: 12.12.2009
Сообщений: 7,222
Записей в блоге: 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
Каратель
Эксперт С++
6552 / 3972 / 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
Эксперт С++
1035 / 814 / 48
Регистрация: 30.04.2011
Сообщений: 1,658
25.06.2011, 04:58     сдвиги длинного числа влево и вправо на заданное количество цифр #7
Цитата Сообщение от Kastaneda Посмотреть сообщение
На сколько я понимаю нужно реализовать сдвиг массива, в чем проблема?
Не. Все ГОРАЗДО проще.
Сдвиг влево - ДОБАВЛЯЕМ в массив 0.
Сдвиг вправо - удаляем последний элемент.
Для vector - тривиально!
alex_x_x
бжни
2445 / 1650 / 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
Эксперт С++
1035 / 814 / 48
Регистрация: 30.04.2011
Сообщений: 1,658
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
1249 / 974 / 49
Регистрация: 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++
Осуществить сдвиг влево/ вправо элементов C++
C++ Нужно сдвинуть число на 4 разряда влево и вправо
Сдвинуть элементы на одну позицию вправо\влево C++

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

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

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