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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сложение длинных чисел 
:(
    Опции темы
molodzo
Дата 6.1.2008, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Помогите исправить ошибку... Пытаюсь сложить длинные числа, но они складываются неправильно!!!

Вот весь код программы:

Код

#include <iostream.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h> // for function "atoi"


class DlinChisla
{
   public:
   int *a, *b, *c;
   int len_1, len_2, sr, len1_do, len2_do, k;

   DlinChisla() // constructor
      {
         // dinamicheski videlennay pamyat' pod massivi
        a = new int[1000];
        b = new int[1000];
        c = new int[1000];
      }

   ~DlinChisla() // destructor
      {
         cout << "\nDelete...";
         delete[] a;
         delete[] b;
         delete[] c;
     cout << "Ok";
      }

      // function
      void input();
      void sravnenie();
      void slogenie();
      void vivod();
};



// vvod chisel

void DlinChisla::input()
{
   int i, pos;
   char *temp;
   char s[1000];

   // vvod 1-go chisla

   cout << "Vvedite 1-e chislo: ";
   cin >> s;
   len_1=strlen(s);
   len1_do=len_1;
   i=len_1-1;
   pos=0;
   temp="";
   while (i>=0)
   {
      if (s[i]=='.') { len1_do=i; }
      *temp=s[i];
      a[pos]=atoi(temp);
      pos++;
      i--;
   }
   cout << endl;

   // vvod 2-go chisla

   cout << "Vvedite 2-e chislo: ";
   cin >> s;
   len_2=strlen(s);
   len2_do=len_2;
   i=len_2-1;
   pos=0;
   temp="";
   while (i>=0)
   {
      if (s[i]=='.') { len2_do=i; }
      *temp=s[i];
      b[pos]=atoi(temp);
      pos++;
      i--;
   }
   sravnenie();
   slogenie();
}


void DlinChisla::sravnenie()
{
   if (len1_do > len2_do) { cout << "len1_do > len2_do"; }
   else
   if (len1_do < len2_do) { cout << "len1_do < len2_do"; }
   else { cout << "len1_do = len2_do"; }
}

void DlinChisla::slogenie()
{
   int i;
   if (len_1 > len_2) k=len_1; else k=len_2;
   for (i=k-1; i>=0; i--)
   {
      c[i]=a[i]+b[i]+c[i];
      if (c[i]>9)
      {
         c[i+1]+=(c[i]/10);
         c[i]%=10;
      }
   }
   vivod();
}


void DlinChisla::vivod()
{
   int i;
   if (len_1 > len_2) k=len_1; else k=len_2;
   while (c[k]==0 && k>0) k--;
   int p;
   for (p=k; p>=0; p--) cout << a[p];
   cout << endl;
   for (i=k; i>=0; i--) cout << c[i];
   getch();
   return;
}




int main()
{
   clrscr();
   class DlinChisla DlinOb; // cozdanie ob'ekta classa
   DlinOb.input();
}



 ! 
archimed7592
Пользуйся тегами [code][/code].


Это сообщение отредактировал(а) archimed7592 - 6.1.2008, 21:15
PM MAIL   Вверх
cardinal
Дата 6.1.2008, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: нет
Всего: 99



Пользуйтесь тегом "код"!

А для отладки есть пошаговый режим - сразу найдете ошибку...

Что мне сразу в глаза бросилось, так это строка
Код

c[i]=a[i]+b[i]+c[i];

Может в ней все и правильно, но мне она не нравится - проверьте! smile 


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
bsa
Дата 6.1.2008, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



molodzo
Во-первых, у тебя Borland C++ 3.1 или что-то более старое?
Во-вторых, class - это тип переменных, поведение которого ты сам задаешь. Т.е. тебе не нужно делать один класс, в котором содержатся все переменные, тебе нужно сделать один класс, который является задает поведение однотипных переменных:
Код
class BigNumber
{
      char data[1000];
...
public:
      BigNumber(void) {
           memset(data, 0, sizeof(data));
      }
...
      BigNumber operator+(const BigNumber& num) const { //сложение
          ...
      }
      BigNumber operator-(const BigNumber& num) const { //вычитание
          ...
      }
      BigNumber operator*(const BigNumber& num) const { //умножение
          ...
      }
      BigNumber operator/(const BigNumber& num) const { //деление
          ...
      }
      const BigNumber& operator=(const BigNumber& num) { //оператор присваивания
          ...
      }
...
};
...
ostream& operator<<(ostream &stream, const BigNumber &num) //вывод, например через cout
{
...
}
istream& operator>>(istream &stream, BigNumber &num) //ввод, например через cin
{
}
...
int main()
{
     BigNumber a, b, c;
     cout << "Input number A = " << flush;
     cin >> a;
     cout << "Input number B = " << flush;
     cin >> b;
     cout << "Input number C = " << flush;
     cin >> c;
     cout << "A+B = " << (a+b) << endl;
     cout << "A*B = " << (a*b) << endl;
     cout << "C-B = " << (c-b) << endl;
     return 0;
}

PM   Вверх
molodzo
  Дата 7.1.2008, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



У меня Borland C++ 5, но по-моему тоже глючит... Если знаете, где скачать версию поновее, буду очень благодарен!
Bsa, если честно, то я мало понял, как мне может помочь переопределение сложения в данной ситуации!.. smile 
PM MAIL   Вверх
JackYF
Дата 8.1.2008, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(molodzo @  7.1.2008,  20:28 Найти цитируемый пост)
но по-моему тоже глючит... 

ну рассказывай, как... или плати за телепатов  smile 


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
bsa
Дата 8.1.2008, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(molodzo @ 7.1.2008,  21:28)
Bsa, если честно, то я мало понял, как мне может помочь переопределение сложения в данной ситуации!.. smile

Посмотри внимательно на код функции main() в том примере, что я привел.
PM   Вверх
xvr
Дата 9.1.2008, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(molodzo @ 6.1.2008,  19:10)
Помогите исправить ошибку... Пытаюсь сложить длинные числа, но они складываются неправильно!!!

Во первых у тебя не обнулен массив c, а ты к нему прибавляешь массивы a и b
Во вторых (судя по коду заполнения массивов a & b) у тебя данные в них лежат начиная с младших разрядов, но в таком случае, складывать из тоже нужно начиная с начала массива, а не с конца.

PM MAIL   Вверх
molodzo
  Дата 9.1.2008, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем спасибо!!! smile  smile 
xvr, ты прав. Нужно было добавить:
                        memset( a, 0, 1000*sizeof(int) );
                        memset( b, 0, 1000*sizeof(int) );
                        memset( c, 0, 1000*sizeof(int) );
PM MAIL   Вверх
JackYF
Дата 9.1.2008, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



molodzo, не забывай помечать тему решённой.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
molodzo
Дата 9.1.2008, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Погоди ты! Очень торопишься...   smile                                       
Дело в том, что я хочу сделать сложение вещественных чисел. 
Для этого создаю массивы типа не int, а CHAR, но при выводе получается "абракадабра". Как мне это исравить???????
PM MAIL   Вверх
cardinal
Дата 9.1.2008, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: нет
Всего: 99



Пример в цифрах приведи. Если у тебя в char'aх значения ascii, то вычти 0x30 из каждого и будет тебе число...


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
molodzo
Дата 9.1.2008, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Смотри, если массивы типа int, то 45+9=54
              если ----------------- char, то 45+9=,;ok(например)    
PM MAIL   Вверх
cardinal
Дата 9.1.2008, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: нет
Всего: 99



Цитата(molodzo @  9.1.2008,  16:59 Найти цитируемый пост)
Смотри, если массивы типа int, то 45+9=54
              если ----------------- char, то 45+9=,;ok(например)     


(4-0x30)(5-0x30)+(9-0x30)=54

0x30 (hex) = 48 (dec)

http://didgood.com/programing/datatheory/A...CII%20Codes.htm


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
molodzo
Дата 9.1.2008, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Если честно, то я не понимаю, как работать с табл. ASCII-кодов...  smile 
PM MAIL   Вверх
cardinal
Дата 9.1.2008, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: нет
Всего: 99



Ascii числа 6 например равно 0х36 (то есть char a = 0x36 это будет цифра шесть как знак), чтобы получить само число надо вычесть из 0х36 - 0х30 = 0х06, то есть 6. smile 


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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