Здравствуйте! У меня проблема вот в чем: при повторном вызове 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;
|
|