Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 24.07.2015
Сообщений: 7
1

Ускорить программу, длинная арифметика, классы

27.09.2015, 16:48. Показов 396. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Условие задачи:
Кликните здесь для просмотра всего текста
Вам задано число А и основание системы счисления D - оба в десятичном
представлении. Найдите запись числа А в D-ной системе счисления.
Входные данные
Первый ряд входного файла содержит десятичную запись числа А длиною НЕ больше
1000 знаков. Второй ряд этого же файла содержит десятичную запись основы системы
счисления D, также длиной не более 1000 знаков.
Исходные данные
Выведите в выходной файл запись числа А в D-ной системе счисления, причем, если
цифра в D-ной системе счисления находится в пределах от 0 до 9, выводите саму
цифру, если же цифра больше 9, ее десятичную запись необходимо взять в
квадратные скобки.
Пример данных:
123
21
5 [18]
Примечание: вместо файлов консоль подходит отлично

Мой код:
Кликните здесь для просмотра всего текста
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
#include <iostream>
 
using namespace std;
 
const int MAX=1000;
 
class longint ///класс длинных чисел
{
private:
    int arr[MAX]; ///число в виде массива
    int sz; ///кол-во значимых цифр
public:
    longint(): sz(0) { for(int i=0; i<MAX; i++) arr[i]=0; }
    longint(bool): sz(0) {}
    bool operator==(longint& li2)
    {
        for (int i=0; i<MAX; i++)
            if (arr[i]!=li2.arr[i]) return false;
        return true;
    }
    bool operator>(longint& li2)
    {
        for (int i=0; i<MAX; i++)
            if(arr[i]!=li2.arr[i])
                return arr[i]>li2.arr[i];
    }
    friend istream& operator>>(istream& in, longint& li1)
    {
        string s; in >> s;
        li1.sz=s.length();
        for (int i=MAX-li1.sz; i<MAX; i++)
            li1.arr[i]=s[i-(MAX-li1.sz)]-48;
        return in;
    }
    friend ostream& operator<<(ostream& on, longint& li1)
    {
        if(li1.sz==0) on << '0';
        else
        for (int i=MAX-li1.sz; i<MAX; i++)
            on << li1.arr[i];
        return on;
    }
    longint operator-(const longint& li2)
    {
        longint li3;
        for (int i=MAX-1; i>0; i--)
        {
            if(arr[i]<li2.arr[i])
            {
                arr[i]+=10;
                arr[i-1]-=1;
            }
            li3.arr[i]=arr[i]-li2.arr[i];
        }
        ///установка "размера" числа
        for (int i=0; i<MAX; i++)
            if (li3.arr[i]!=0)
            {
                li3.sz=MAX-i;
                break;
            }
        return li3;
    }
    longint divmod(longint& li2, longint& ostreturn)
    {
        ///просто алгоритм деления длинного на длинное
        longint li3;
        longint ost;
        int temp;
        for (int i=MAX-sz; i<MAX; i++)
        {
            for (int j=MAX-sz-1; j<MAX-1; j++) //*10
                ost.arr[j]=ost.arr[j+1];
            ost.arr[MAX-1]=arr[i];
            ost.sz++;
            temp=0;
            while (ost>li2||ost==li2)
            {
                ost=ost-li2;
                temp++;
            }
            li3.arr[i]=temp;
        }
        ///установка "размера" числа
        for (int i=0; i<MAX; i++)
            if (li3.arr[i]!=0)
            {
                li3.sz=MAX-i;
                break;
            }
        else ostreturn=ost;
        return li3;
    }
    int get_sz()
    {
        return sz;
    }
    ///для ответа на вопрос "Однозначное ли это число?"
};
 
int main()
{
    longint A, D, zero, temp;
    longint arr[MAX/10]; ///100, думаю, хватит
    ///Как можно запустить конструктор с булевым аргументом при создании элемента в массиве? 
    ///Ведь тут не нужно обнулять 1000 ячеек 100 массивов
    int i=0;
    cin >> A; cin >> D;
    while(A>zero)
    {
        ///просто алгоритм перевода между системами счисления
        A=A.divmod(D, temp);
        arr[i++]=temp;
    }
    for (int j=i-1; j>=0; j--)
    {
        if(arr[j].get_sz()>1)
            cout << "[" << arr[j] << "]";
        else cout << arr[j];
    }
    return 0;
}

Тестировал все методы класса в отдельности и программу в целом много раз - багов не нашел. Не проходит ни одного теста из-за времени работы, которое больше положенного в 10-30 раз (к слову, в самой первой версии, оно было на порядок меньше - уже не помню, что я поменял, увы). Пробовал многое, доходило до увеличения на два порядка, но никак не уменьшения. Пожалуйста, помогите. Очень обидно, потратил много времени в пустую
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.09.2015, 16:48
Ответы с готовыми решениями:

Классы, Длинная арифметика, LongLong
Добрый день, Задание изначально было такое: Реализовать класс Money , используя для...

Длинная арифметика
Подскажите, пожалуйста, где ошибки в программе. Еще хотелось бы узнать, правильно ли реализована...

Длинная арифметика
http://www.********/index.asp?main=task&amp;id_task=103 Как решить эту задачу? С помощью чего, и в...

Длинная арифметика
:senor: Здраствуйте, пишу модуль длинной математики. В принципе, работоспособность у него...

0
27.09.2015, 16:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.09.2015, 16:48
Помогаю со студенческими работами здесь

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

Длинная арифметика
Здравствуйте, вопрос по поводу задачки, хочу попытаться реализовать решение на плюсах, а не на...

Длинная арифметика
Как сделать типы длинных чисел, например, знаковое 256-ти битное целое и 256-ти битное вещественное...

Длинная арифметика
Вот условие задачи: Во время исследований, посвященных появлению жизни на планете Олимпия, учеными...


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

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