0 / 0 / 0
Регистрация: 19.11.2016
Сообщений: 39
1

Остаток от деления (длинная арифметика)

19.11.2016, 17:21. Показов 8469. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здраствуйте, друзья мне нужно написать программу вычисляющую остаток от деления m-значного числа на n-значное, где (m и n>20). Дайте пожалуйста какие нибудь ИДЕИ решения на C++ я написал но у меня вышло около 200 строк, мне кажется есть какой то более эффектиыный способ. Помогите, пожалуйста.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.11.2016, 17:21
Ответы с готовыми решениями:

Длинная арифметика: найти частное и остаток от деления числа a на b
Даны два длинных числа a и b. Найти частное и остаток при делении числа a на b. Не могу...

Длинная арифметика (найти остаток при делении на 7)
Уважаемые программисты! Задача на длинную арифметику (никогда такую не решал, потому хочу...

Найти частное и остаток от деления нацело без операции деления
1)Дано целое число A (> 0) и целое число B (> 0). Найти долю Q и остаток R от деления нацело числа...

Найти частное от деления нацело N на K, а также остаток от этого деления
While3. Даны целые положительные числа N и K. Используя только операции сложения и вычитания, найти...

6
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
19.11.2016, 19:34 2
Цитата Сообщение от Atakai Посмотреть сообщение
Чем Вам не угодил оператор
Числа не влезают в int. Вы немного неправильно прочли заданию. m, n - это не числа, а их значность, количество знаков. Сами числа > 1020, и для них ваш код совершенно ни к селу ни к городу

Добавлено через 4 минуты
Ryndysh, Как я понял, вы используете какую-то самопальную длинную арифметику. (в этом ничего плохого) Конечно, ваш 200-строчный код смотреть будет трудновато, но попробуйте показать самое главное. В крайнем случае - покажите весь код. Только не забудьте заключить его в теги для комфортного прочтения.
0
0 / 0 / 0
Регистрация: 19.11.2016
Сообщений: 39
19.11.2016, 22:04  [ТС] 3
Ну собственно, моя идея, заключается в том что) я принимаю числа в виде строк и потом вычитаю из первой вторую , пока первая не станет меньше второй) Сама суть заключается в вычитании(то есть как вычесть из одной строки другую) я написал вот такой код но и он работает не правильно, может подскажете как вычитание строк сделать лучьше и короче?
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
void Subtraction(string &numerator, string &denomerator, int n, int&m)
{
    int loan = 0;
    int i = m-1, j = n-1;
    int a, b;
    while((i!=-1 && j!=-1) || (j==-1 && loan!=0))
    {
        
 
        a = numerator[i]-'0';
        if (j==-1 && loan!=0 && a!=0)
        {
            a-=1;
            loan =  0;
            numerator[i] = a+'0';
            i--;;
            continue;
        }
        if(j!=-1)
        b = denomerator[j]-'0';
        else 
            b= denomerator[0]-'0';
        if(a>b)
 
        {       
        if (loan == 1)
            {
                a=-1;
                loan = 0;
            }
            a-=b;
            numerator[i] = a+'0';
            i--;j--;
        }
 
        else if(a<b)
        {if(a==0 && loan == 1)
        a+=9;
        else
            a+=10;
            a-=b;
            loan = 1;
            numerator[i] = a+'0';
            i--;j--;    
        }
        else 
        {
            if (loan == 1 && a !=0)
            {
                a=-1;
                loan = 0;
            }
                if(a<b)
                {
                    a+=10;
                    a-=b;
                    loan = 1;
                    numerator[i] = a+'0';
                    i--;j--;
                    
                }
                else 
                {
                        a-=b;
                    numerator[i] = a+'0';
                    i--;j--;
                }
        }   
    }
    deleteZero(numerator,m);
    numerator = deleteSpace(numerator,m);
}
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
19.11.2016, 22:59 4
Ryndysh, Смотрю на ваш код. И не понимаю. Зачем вы выложили столько пустых строк? Вы думаете, мне от этого на ваш код смотреть будет интересней? Это не так. Это вынуждает совершенно бессмысленное его листание. Чем компактнее (буквально) код, тем легче его анализировать. Тем не менее, коли я в этот топик уже ввязался, я его возьму к себе и первым делом уберу "воздух". Это на будущее. Есть еще более серьезные замечания, но это - потом.

Добавлено через 22 минуты
Ryndysh, Вынужден просить прощения, но сейчас я в вашем коде не разберусь. Время уже позднее, и гости совсем недавно ушли
Вот, я привел код к виду, на который мне смотреть приятнее. Проверьте, не сломал ли чего.
Идея, в общем-то понятная. Школьный столбик, да?
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
void Subtraction(string &numerator, string &denomerator, int n, int&m)
{
    int loan = 0;
    int i = m-1, j = n-1;
    int a, b;
    while((i!=-1 && j!=-1) || (j==-1 && loan!=0))  {
        a = numerator[i]-'0';
        if (j==-1 && loan!=0 && a!=0)  {
            a-=1;
            loan =  0;
            numerator[i] = a+'0';
            i--;
            continue;
        }
        if(j!=-1) b = denomerator[j]-'0';
        else      b = denomerator[0]-'0';
        if(a>b) {
          if (loan == 1) {
            a=-1;
            loan = 0;
          }
          a-=b;
          numerator[i] = a+'0';
          i--;j--;
        }
        else if(a<b) {
          if(a==0 && loan == 1) a+=9;
          else a+=10;
          a-=b;
          loan = 1;
          numerator[i] = a+'0';
          i--;
          j--;
        }
        else  {
            if (loan == 1 && a !=0) {
                a=-1;
                loan = 0;
            }
            if(a<b) {
              a+=10;
              a-=b;
              loan = 1;
              numerator[i] = a+'0';
              i--;
              j--;
            }
            else {
              a-=b;
              numerator[i] = a+'0';
              i--;j--;
            }
        }
    }
    deleteZero(numerator, m);
    numerator = deleteSpace(numerator, m);
}
0
0 / 0 / 0
Регистрация: 19.11.2016
Сообщений: 39
19.11.2016, 23:30  [ТС] 5
Байт, Спасибо за замечания, я первый раз на форуме по тихоньку начну осваиватьтся) Да вы правильно поняли, идея школьного столбика)
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
20.11.2016, 11:37 6
Лучший ответ Сообщение было отмечено Ryndysh как решение

Решение

Ryndysh, нашел ошибочку. В твоем коде (пост 5) строчка 28. У тебя "a = -1;" Надо " a -= 1;" или "a--"

Добавлено через 16 минут
Цитата Сообщение от Ryndysh Посмотреть сообщение
я принимаю числа ... и потом вычитаю из первой вторую , пока первая не станет меньше второй
Сам, наверное, понимаешь, что это не самый эффективный алгоритм Например, одно число 12345678901, а другое просто 2
Может быть имеет смысл хотя бы привести меньшее число к такому же порядку, что и большее, т.е. дописать несколько нулей справа, пока длина меньшего остается меньше .
Так, для приведенного примера мы сразу вычтем 2000000000, получится 10345678901, потом еще разок - 8345678901, потом несколько раз по 2000000000 ... - все быстрее будет. Наверное, можно придумать и более тонкие способы избежать огромного количества вычитаний, я привел самый грубый и легко реализуемый...
2
0 / 0 / 0
Регистрация: 19.11.2016
Сообщений: 39
20.11.2016, 12:25  [ТС] 7
Всё понял) спасибо вам, я понимаю что это неэффективный способ, но что-то ничего другого в голову не лезет
0
20.11.2016, 12:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.11.2016, 12:25
Помогаю со студенческими работами здесь

Длинная арифметика
Ребята,объясните как решить задачу , напишите хоть часть кода. Пусть даны числа a , b . Найти...

длинная арифметика
Долгое время бьюсь как составить программу по этой теме в интернете искал нашел это for (int...

Длинная арифметика
Нужно написать программу которая полностью выводит число 2^-200. (желательно с комментариями, для...

Длинная арифметика
Алгоритмы всех операций в принципе уже готовы (длина числа ограничивается только ресурсами ПК)....


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru