Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Длинная арифметика 
:(
    Опции темы
flyleaf
Дата 27.4.2011, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 40
Регистрация: 6.4.2009

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



Здравствуйте! У меня проблема вот в чем: при повторном вызове sub из функции mod в результат выводит что то типа "24/t/b" что при следующем вычитании дает еще большее переполнение. Сама функция вычитания работает нормально. Помогите найти ошибку плииз. ниже функция вычитания, функция мод и тип вызова...

Вычитание :
Код

int sub(AnsiString A, AnsiString B, AnsiString &Result)
{
   int len = max(A.Length(),B.Length()), i=1;
   int s=0;
   char tmp,tmp1;
   int l,l1;
   AnsiString res;
   Result=NULL;
/* if (A.Length()<B.Length())
{
  res =A;
  A=B;
  B=res;
} */
  res.SetLength(A.Length());
 A=reverse(A);
 B=reverse(B);
   for(i=1;i<=A.Length();i++)
   {
      if(i<=B.Length())
        tmp = A[i] - B[i] - s+ '0';
      else
         tmp = A[i] - s;
      if(tmp < '0')
      {
        tmp1 = tmp + 10;
        tmp = '1';
         s=1;

      }
      else
      {
         tmp1 = tmp;
         tmp = '0';
         s=0;
      }
      if(i == len && tmp1 == '0') {
        res.SubString(res.Length()-1,1);}
       }
     res = res + tmp1;
    }
    for(i=res.Length();i>0;i--)
if(res[i]=='0')  res.SetLength(res.Length()-1); else break;
  Result=reverse(res);
  return true;
}


Функция остатка от деления 

Код

int mod(AnsiString A, AnsiString B,AnsiString &Result)
{
   AnsiString res;
   res=A;
    while(divided(res,B))
    {
       sub(res, B,res);
          }
         Result=res;
  return 0;
}


Проверка на возможность вычитания:

Код

bool divided(AnsiString A, AnsiString B)
{
 if (A.Length()>B.Length())
 {
  return true;
 }
 else
 {
  if(A.Length()<B.Length())
  {
   return false;
  }
  else
  {
   if (A>=B)
   {
    return true;
   }
   else
   {
    return false;
   }
  }
 }
}



Функция реверса строки:

Код

AnsiString reverse(AnsiString str)
{
AnsiString res;
res.SetLength(str.Length());
       for(int i = str.Length(); i >0; i--)
       {
          res[str.Length()-i+1]=str[i];
       }
    return res;
}



Вызов:

Код

 AnsiString a;
   G=Edit1->Text;
P=Edit2->Text;
mod(G,P,a);
Memo1->Text=a;


Это сообщение отредактировал(а) flyleaf - 27.4.2011, 22:26
PM MAIL ICQ   Вверх
flyleaf
Дата 28.4.2011, 01:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 40
Регистрация: 6.4.2009

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



Задача решена =) 
PM MAIL ICQ   Вверх
borisbn
Дата 28.4.2011, 06:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Дык колись smile
Вроде все правильно было...


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
flyleaf
Дата 28.4.2011, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 40
Регистрация: 6.4.2009

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



Та я по людски переписала функцию Sub (вычитание) двигая сначала по длинне меньшего, а потом от того что в большем осталось отнимая сдвиг, и там уменьшая размер. Сработало) 

Код

int sub(AnsiString A, AnsiString B, AnsiString &Result)
{
  AnsiString res;
if (A.Length()<B.Length())
{
res =A;
A=B;
B=res;
}
res.SetLength(A.Length());

int i, s=0;
char tmp;
 A=reverse(A);
 B=reverse(B);

for(i=1;i<=B.Length();i++)
{
        tmp = A[i] -  B[i] - s;

 if (tmp < 0)
 {
   s=1;
   res[i] = tmp+'0'+10;
 }
 else
 {
        res[i]=tmp+'0';
        s=0;
 }
}
for(i=B.Length()+1;i<=A.Length();i++)
{
    tmp = A[i]-'0' -  s;
    if (tmp < 0)
 {
   s=1;
   res[i] = tmp+'0'+10;
 }
 else
 {
       res[i]=tmp+'0';
        s=0;
 }
}
if (s<0)
{
res=res-1;
res.SetLength(res.Length()-1);
}
for(i=res.Length();i>1;i--)
if(res[i]=='0') res.SetLength(res.Length()-1);
else break;
Result=reverse(res);
return true;
}

PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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