Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сложить два 40-значных числа 
V
    Опции темы
IKM2007
Дата 31.5.2008, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: 3
Всего: 40



Всем доброй ночи.
У меня 2 вопроса.
1.)Как можно int преабразовать в char,(в нижеприведенной программе такая проблема),
типа int a=1;char x; x=?????; cout<<x<<endl;//  1
и
2.)Как легче всего сложить два до-40-значных числа, например один может быть 23-значным, а второй 37-значным..., а то в моем написанном очень запутанно.
Код

#include <iostream.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>
class T
{friend ostream& operator <<(ostream&,const T&);
friend istream& operator>>(istream&,T&);
public:
    T();//(1)konstruktor
    T(const char*);//(2)konstruktor
    T(T&);//(3)copy konstruktor
    ~T();//destruktor
    const T &operator=(const T&);
    T operator+(T&);
private:
    char *a;
};
T T::operator +(T &x)
{    T y;
    int i=strlen(this->a);
    int j=strlen(x.a);int k=i>j?i:j;
    for(;i>=0&&j>=0;i--,j--,k--)
    {char *m=&(this->a[i]),*n=&(x.a[j]);
    int u=(atoi(m)+atoi(n))%10,o=(atoi(m)+atoi(n))/10;
        y.a[k]=u;//////////////////??????????????int->char
    y.a[k+1]=o;//////////////////??????????????int->char
    }
    if(i>0)
    for(;k>=0;k--)
    {char *m=&(this->a[k]),*n=&(y.a[k]);
     int u=(atoi(m)+atoi(n))%10,o=(atoi(m)+atoi(n))/10;
    y.a[k]=u;////////////////??????????????????int->char
    y.a[k+1]=o;//////////////////??????????????int->char
}
    else if(j>0)
        for(;k>=0;k--)
    {char *n=&(x.a[j]),*m=&(y.a[k]);
        int u=(atoi(m)+atoi(n))%10,o=(atoi(m)+atoi(n))/10;
            y.a[k]=u;//////////////////??????????????int->char
    y.a[k+1]=o;//////////////////??????????????int->char
}
return y;
}
//------------------------------------------------------------------------
istream& operator>>(istream &s,T &x)
{
    cout<<"Enter minchev 40-nishani tiv u tiv@ neraceluc heto sexmek ENTER"<<endl;
return s.getline(x.a,40,'\n');
}
//------------------------------------------------------------------------
ostream& operator<<(ostream &s,const T &x)
{
return s<<"["<<x.a<<"]"<<endl;
}
//------------------------------------------------------------------------
const T& T::operator =(const T &x)
{if(&x!=this)
{
a=new char[41];
assert(a);
strncpy(a,x.a,40);
a[40]='\0';
}
return *this;
}
//------------------------------------------------------------------------
T::T()//(1)konstruktor
{
a=new char[41];
assert(a);
strcpy(a,"0000000000000000000000000000000000000000");
a[40]='\0';
}
//------------------------------------------------------------------------
T::T(const char *x)//(2)konstruktor
{
a=new char[41];
assert(a);
strncpy(a,x,40);
a[40]='\0';
}
//------------------------------------------------------------------------
T::T(T &x)//(3)copy konstruktor
{
a=new char[41];
assert(a);
strncpy(a,x.a,40);
a[40]='\0';
}
//------------------------------------------------------------------------
T::~T()//destruktor
{
delete [] a;
}
//------------------------------------------------------------------------
void main()
{
T x("123454384834347834728474472848"),z=x,p,y;
cin>>x;
y=x;
y=x+z;
cout<<y;
}


Заранее Большое Спасибо.


--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
jonie
Дата 1.6.2008, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



Цитата

2.)Как легче всего сложить два до-40-значных числа, например один может быть 23-значным, а второй 37-значным..., а то в моем написанном очень запутанно.
"столбиком". точно также как вы складываете на бумажке. сложение двух конечных чисел есть конечный автомат, который вам реализовать и нужно. для "простого сложения" вам будет достаточно двух указателей (для перемещения по числам)+буфера "переноса" (ну и конечно буфера результата). устанавливаете два указателя на концы строк-чисел, и... назад,считать).
Цитата

1.)Как можно int преабразовать в char,(в нижеприведенной программе такая проблема),
типа int a=1;char x; x=?????; cout<<x<<endl;//  1
если вам нужно преобразовать число в строку, тогда используйте функцию itoa.
если "число в число" тогда x=a.
если "число в цифру", то с большой вроеятностью подойдет код x = a+'0';


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
IKM2007
Дата 1.6.2008, 07:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: 3
Всего: 40



Цитата(jonie @  1.6.2008,  00:07 Найти цитируемый пост)
"столбиком". точно также как вы складываете на бумажке.

Я так и сделал, но нет алгоритма покороче?
и
char=int+'0'; помог, Спасибо.

Это сообщение отредактировал(а) IKM2007 - 1.6.2008, 07:50


--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
bronislav
Дата 1.6.2008, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 334
Регистрация: 29.1.2008
Где: Украина::Донецк

Репутация: 2
Всего: 3



Цитата(IKM2007 @  1.6.2008,  06:49 Найти цитируемый пост)
Я так и сделал, но нет алгоритма покороче?

Ну поищи в нете библиотеки для длинной арифметики. Там все функции уже реализованы.


--------------------
user posted image
иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes
PM MAIL   Вверх
IKM2007
Дата 1.6.2008, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: 3
Всего: 40



И еще вопрос.
В Дейтел-е есть пример класса Array. Там конструктор присваивания написан в таком виде.
Код

const Array &operator=(const Array &);

Здесь зачем нужен первий const??? Почему он должен возвращать константный обьект, и если он возвращает константный обьект, то почему я могу его менять?????

Это сообщение отредактировал(а) IKM2007 - 1.6.2008, 17:00


--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
bsa
Дата 1.6.2008, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(IKM2007 @ 1.6.2008,  13:12)
И еще вопрос.
В Дейтел-е есть пример класса Array. Там конструктор присваивания написан в таком виде.
Код

const Array &operator=(const Array &);

Здесь зачем нужен первий const??? Почему он должен возвращать константный обьект, и если он возвращает константный обьект, то почему я могу его менять?????

Он возвращает не константный объект, а ссылку на него. И менять ты его не можешь, попробуй сделать так:
Код
Array a, b, c;
...
(a = b) = c;
И увидишь, что константность нужна для предотвращения подобных конструкций.
PM   Вверх
IKM2007
Дата 1.6.2008, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: 3
Всего: 40



bsa, спасибо за ответ, и ... еще вопрос,
class M
{
 friend istream& operator>>(istream&,const M&);
-------------------------------------
-------------------------------------
-------------------------------------
};

нужна ли const(ОГРОМНЫЙ такой)? И если нужна, для чего?
Вот например, в 
Код

friend ostream& operator<<(ostream&,const M&);

const нужен, чтобы могли печатать и константные, и неконстантные обьекты. А там???


--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
bronislav
Дата 1.6.2008, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 334
Регистрация: 29.1.2008
Где: Украина::Донецк

Репутация: 2
Всего: 3



Пожалуйста для отдельных вопросов создавайте отдельные темы.


--------------------
user posted image
иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes
PM MAIL   Вверх
bsa
Дата 2.6.2008, 11:31 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



IKM2007, во-первых, поддерживаю bronislav.
Во-вторых, там константность не нужна, так как operator>>(std::istream  &stream, Class &obj) изначально предназначен для изменения значения obj (т.е. загрузки значения из stream).
PM   Вверх
IKM2007
Дата 2.6.2008, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: 3
Всего: 40



bsa, спасибо, все. ТЕМА ЗАКРЫТА.


--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0876 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.