ورود

View Full Version : سوال: اعمال ریاضی در اعداد بزرگتر از int



mohammaddx
سه شنبه 04 فروردین 1394, 12:02 عصر
سلام به همه ی دوستان.تایپیک هایی تقریبا با همین موضوع تو انجمن دیدم که تقریبا نا مربوط به روشی که من میخوام بود.
برای پروژه عید c++ دانشگاهمون به مشکل خوردم که درخواست کمک از شما دارم.قسمتی از متن توضیحات پروژه:
نوشتن ماشین حساب علمی کمی متفاوت تر و نیاز به زمان بیشتری دارد . ھدف از این ماشین حساب بیشترتوجه به مبحث composition:objects as member of classes (برای مشاھده مثالی از این سر فصلبھ بخش ٣ فصل ١٠ کتاب دایتل مراجعھ فرمایید.) می باشد. چرا که برای عمل جمع اعداد بزرگتر از٩٩٩٩٩٩٩٩٩ نمی توان از نوع پایھ ی int استفاده کرد لذا شما باید کلاس دیگری بھ نام bignum طراحی کنیدکه در آن جمع اعداد بزرگ میسر باشد ، برای این کار باید اعداد را بھ صورت رشتھ ای از کاراکتر ھا ازکاربر گرفتھ و سپس عمل جمع را در کلاس bignum شبیھ سازی کنید.حال باید یک شئ از کلاس bignumدر کلاس ماشین حساب علمی تعریف کنید و به جای نوع پایه ی int از آن استفاده کنید.
**********
لطفا کمی راهنمایی کنید که از objects as member of classes باید چه استفاده ای در اینجا بکنم و چه طور باید شبیه سازی اعمال چهارگانه ریاضی را روی استرینگ ها پیاده سازی کنم.با تشکر

Ananas
سه شنبه 04 فروردین 1394, 13:15 عصر
سلام.
میتونید یک کلاسی طراحی کنید به نام bignum که توابع داخل کلاس با آرایه ای از اعداد صحیح به عنوان ارقام کار کنن و نیازی نیست که محاسبات روی استرینگ انجام بشه.
و دو تا تابع لازم هست که تبدیل از استرینگ به bignum و برعکس رو انجام بده که قبل از محاسبات استرینگ به bignum تبدیل بشه و بعد از انجام محاسبات هم bignum به استرینگ.
داخل کلاس هم توابع به روش معمولی کار میکنن و ارقام رو جمع و تفریق و ... میکنن.

Ananas
سه شنبه 04 فروردین 1394, 13:47 عصر
اگر بخواید محاسبات بر روی استرینگ انجام بشه باید کاراکتر هارو منهای '0' کنید و برای چاپ کردن هم با '0' جمع کنید. مثال برای تابع جمع دو عدد صحیح مثبت:

#include <iostream>
using namespace std;

int Maximum(const int X, const int Y)
{
if (X > Y) return X; else return Y;
}

void BigNumAddStr(const char * str_A, const char * str_B)
{
int len_A = strlen(str_A);
int len_B = strlen(str_B);
int a = len_A;
int b = len_B;
int c = Maximum(len_A, len_B) + 2;
char * p_out = (char *)malloc(sizeof(char) * c);
c--;
p_out[c] = char(0);
int k = 0;
while ((a > 0) && (b > 0))
{
a--;
b--;
c--;
k = (str_A[a] - '0') + (str_B[b] - '0') + k / 10;
p_out[c] = k % 10 + '0';
};
while (a > 0)
{
a--;
c--;
k = (str_A[a] - '0') + k / 10;
p_out[c] = k % 10 + '0';
};
while (b > 0)
{
b--;
c--;
k = (str_B[b] - '0') + k / 10;
p_out[c] = k % 10 + '0';
};
k /= 10;
if (k != 0)
{
c--;
p_out[c] = k + '0';
};
while (c > 0)
{
c--;
p_out[c] = ' ';
}
cout << p_out << endl;
};

int main()
{
char str_A[128];
char str_B[128];

while (true)
{
cin >> str_A;
cin >> str_B;

BigNumAddStr(str_A, str_B);
};

return 0;
}