Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.04.2010, 08:49   #1
airwind
Новичок
Джуниор
 
Регистрация: 26.04.2010
Сообщений: 2
По умолчанию C++ Работа с большими числами

Здравствуйте. Для курсовой выдана задача:
"Реализация класса "большие числа"
класс должен инициализироваться как от целых чисел, так и от строкового представления чисел. Должны быть реализованы операторы сложения и умножения "большого" числа на "большое". Курс работа должна включать в себя, помимо этого класса, небольшую программу, демонстрирующую его возможности."
Можете либо дать ссылку на теорию по этому вопросу, либо написать эту небольшую программу? Заранее спасибо.
airwind вне форума Ответить с цитированием
Старый 26.04.2010, 10:51   #2
RUSt88
Участник клуба
 
Регистрация: 29.12.2009
Сообщений: 1,166
По умолчанию

что значит "большие числа"?

которые не влезают даже в int64 ? или что? поясните
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть]
RUSt88 вне форума Ответить с цитированием
Старый 26.04.2010, 13:43   #3
airwind
Новичок
Джуниор
 
Регистрация: 26.04.2010
Сообщений: 2
По умолчанию

то есть числа астрономической величины (типа радиуса Солнца в километрах), которые не могут быть заданы стандартными переменными С++.
airwind вне форума Ответить с цитированием
Старый 27.04.2010, 13:59   #4
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Цитата:
Сообщение от airwind Посмотреть сообщение
то есть числа астрономической величины (типа радиуса Солнца в километрах), которые не могут быть заданы стандартными переменными С++.
Ну это всего лишь 7 млн км - C++ такое может. Маленький пример демонстрирующий сложение и умножение столбиком чисел длинной до n/2 цифр.
Код:
#include <cstdlib>
#include <iostream>
#include <algorithm>

using namespace std;

const int n=20;//максимальная длина 20/2=10 символов 
int a[n], b[n], c[n];
char s[n], tmp[1];
void input_(int x[])//ввод
//результатом будет занесение цифр в конец массива
{
    int i,j;
    cout<<"input: ";
    cin>>s;
    j=0;
    while (s[j]!='\0') j++;
    i=n;
    while (j>=0)
    {
        tmp[0] = s[j--];
        x[i--]=atoi(tmp);
    }
}
void output_(int x[])//вывод
{
    int i;
    bool b=false;
    for (i=0; i<n; i++)
        if (x[i]!=0) b=true;
    if (b==true)//если не нулевой массив
    {
        for (i=0; i<n; i++)
            cout<<x[i];
        cout<<endl;
    }
}
void Inc10(int x[])//умножение на 10 (сдвиг влево)
{
    int i;
    for (i=1; i<n; i++)
        x[i-1]=x[i];
    x[n-1]=0;
}
int summa(int x[], int y[], int z[])//суммирование
{
    int i,k;
    for (k=0; k<n; k++) z[k]=0;
    for (i=n-1; i>=0; i--)
    {
        k=x[i]+y[i]+z[i];
        z[i-1]=k/10;
        z[i]=k%10;
    }
}
void proizv(int x[], int y[], int xy[])//умножение столбиком
{
    int z[n],tmp[n],i,j,k;
    for (k=0; k<n; k++)
        xy[k]=0;
    for (i=n-1; i>=0; i--)
    {
        for (k=0; k<n; k++)
            z[k]=0;
        for (j=n-1; j>=0; j--)
        {
            k=x[i]*y[j]+z[j];
            z[j-1]=k/10;
            z[j]=k%10;
        }
        for (j=i; j<n-1; j++) 
            Inc10(z);//циклический сдвиг влево согласно разряду числа
        output_(z);//промежуточный вывод
        copy(xy, xy+n, tmp);//делаем копию массива, т.к. суммирование перезаписывает данные
        summa(tmp, z, xy);//складываем промежуточные значения
    }
}

int main(int argc, char *argv[])
{
    input_(a);
    input_(b);
    output_(a);
    output_(b);
    cout<<"--------------------"<<endl;
    summa(a, b, c);//сумма
    output_(c);
    cout<<endl<<endl;
    output_(a);
    output_(b);
    cout<<"--------------------"<<endl;
    proizv(a, b, c);//умножение
    cout<<"--------------------"<<endl;
    output_(c);
    system("PAUSE");
    return EXIT_SUCCESS;
}
Далее всё засовываем в класс, добавляем инициализацию от целых путём циклического деления на 10 и вычисления остатка, перегружаем операторы если надо, делаем контроль за вводом, оптимизируем под конкретную задачу и т.д. и т.п.
eoln вне форума Ответить с цитированием
Старый 08.12.2010, 15:26   #5
fan_cpp
Новичок
Джуниор
 
Регистрация: 08.12.2010
Сообщений: 2
Восклицание HugeInt

Вот сам писал, мне его на экзамен задавали там все подробно розписано что к чему и как его вообще писать, класс OpenSource так что берите на здоровье дописывайте и розпространяйте под лицензией GPL. Удачи
Ссылка:HugeInt
fan_cpp вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с большими TIFF-изображениями Random2 Мультимедиа в Delphi 11 06.07.2009 21:32
Работа с большими числами (делфи, шифрование RSA) WinApi Помощь студентам 1 05.06.2009 20:43
Доступ к полям компонента TTable с большими целыми числами AleksP Общие вопросы Delphi 6 13.10.2008 18:41
Работа с большими числами SanekIrk Общие вопросы Delphi 3 11.07.2008 22:11
работа с большими числами sasadabest Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 16.10.2007 10:51