چطور اعداد بزرگ تولید کنیم ؟ - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

چطور اعداد بزرگ تولید کنیم ؟

+1 امتیاز

سلام.من می خوام کلاسی بنوسیم که با اعدای کار میکنه که هر تعداد رقمی می توانند داشته باشند.و این اپراتورها باید براش تعریف بشند.و 3 تا سازنده داره.

BigNumber A, B;
cin>>A, B=A, A+B,A+=B, A-B, A-=B, A*B, A*=B, A/B, A/=B,A%B, A%=B, A++, A--, A==B, A > B, A >= B ,
A!=B, A<B, A<=B, cout<<B

 

عملگر ] A[i که رقم i ام A را به صورت int بر می گرداند.
عملگر ) A(i, j که ارقام بین رقم i ام و j ام را به صورت نوعی از BigNumber باز می گرداند
;(&BigNumber(const string 
;(BigNumber (const in
;(&BigNumber (const BigNumber

 

حال سوال من اینه که چطور میتونم اعداد بسیار بزرگ تعریف کنم بدون اینکه از کتابخونه ی خاصی هم استفاده کنم.مسلما unsingned long long int ههم نمیتونه جواب بده.
با تشکر 

 

سوال شده اسفند 23, 1392  بوسیله ی maryam (امتیاز 338)   12 33 44
دوباره تگ گذاری شد فروردین 11, 1393 بوسیله ی BlueBlade

2 پاسخ

+2 امتیاز
 
بهترین پاسخ

string هم سایزش محدوده (مثلاتوی pc  من  2^32 رقمه ... برای دیدن مقدار ماکزیمم می تونین از string::max_size() استفاده کنین )

اگر string هم به اندازه کافی بزرگ نیست میشه از آرایه معمولی استفاده کرد(البته زیاد فرقی نمی کنه )  یا اطلاعات رو داخل یک فایل ریخت و ...

درباره نحوه پیاده سازی و نوشتن operator ها به این شکلی که برات نوشتم بنویس :

#include <iostream>
#include <string>

using namespace std;

class BigNum
{
public:
    BigNum(const string& number) :
        data_(number)
    {
    }
    BigNum(){}

    BigNum& operator+=( const BigNum& other )
    {
        const string &num2 = other.data_;
        string &num1 = this->data_;

        //add num2 to num1 ...

        return *this ;
    }

    //other operators...

private:
    string data_;
    friend ostream& operator<<(ostream&os,const BigNum& number);
};

BigNum operator + ( BigNum lhs,const BigNum& rhs)
{
    return lhs += rhs;
}

ostream& operator<<(ostream& os,const BigNum& number)
{
    os<<number.data_;
    return os;
}

int main( )
{
    BigNum a("123456789");
    BigNum b("2332");

    BigNum c =a; // copy constructor

    c= a+b; // a+b -> copy constructor(a->lhs)  , operator=

    cout<<c;//operator <<

    return 0;
}

 

پاسخ داده شده اسفند 23, 1392 بوسیله ی BlueBlade (امتیاز 15,315)   15 18 89
انتخاب شد اسفند 27, 1392 بوسیله ی maryam
نحوه ی اجرای عملیات ریاضی روی string ها
چرا بعضی توابع مقدار بازگشتیشون & داره ؟
BigNum(const string& number) :
چراconst؟؟
{}()BigNum  برای چیه؟
چون قرار نیست مقدارش داخل تابع عوض بشه const هستش .
اون سازنده پیش فرضه برای اینه که اگر به شکل زیر  هم تعریف کردید درست کار کنه
BigNum a
+3 امتیاز

شما باید اعداد رو داخل رشته نگهداری کنید . با رشته ها میتونید هرتعداد رقمی که خواستید رو داشته باشید .

و باید بتونید با رشته ها به صورت عدد رفتار کنید تا عمل های ریاضی رو روشون انجام بدید .

و یک Method جدید برای کلاس ostream و istream ایجاد کنید تا cout و cin بتونن با کلاس شما کار کنن . که نمونش اینجا هست :

http://www.7khatcode.com/1804/%D9%86%D8%AD%D9%88%D9%87-%D9%86%D9%88%D8%B4%D8%AA%D9%86-%DB%8C%DA%A9-%DA%A9%D9%84%D8%A7%D8%B3-%D8%A8%D9%88%D8%B3%DB%8C%D9%84%D9%87-cout

 

و برای کلاس BigNumber باید operator ها رو سربارگزاری کنید .

و برای تبدیل کردن متغییر هایی مثل int به رشته و بر عکس هم میتونید از این پردازه ها استفاده کنید . ()itoa و ()atoi .

 

این یه برنامس که دو تا عدد رشته ای رو با هم جمع میکرد ( البته فکر میکنم . یادم نیست‌)

#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
 
int main()
{
    char *firstNumber,*secondNumber,*result,buffer[512],tmp = 0,ext = 0;
    unsigned int i,firstNumberLength,secondNumberLength,maxLength,m  inLength;
 
    cout<<"Enter the first number : ";
    cin>>buffer;
    firstNumberLength = strlen(buffer);
    firstNumber = new char[firstNumberLength];
    strcpy(firstNumber,buffer);
 
    for(i = 0;i < firstNumberLength;i++)
    {
        buffer[0] = firstNumber[i];
        buffer[1] = 0;
 
        firstNumber[i] = atoi(buffer);
    }
 
    cout<<"Enter the second number : ";
    cin>>buffer;
    secondNumberLength = strlen(buffer);
    secondNumber = new char[secondNumberLength];
    strcpy(secondNumber,buffer);
 
    for(i = 0;i < secondNumberLength;i++)
    {
        buffer[0] = secondNumber[i];
        buffer[1] = 0;
 
        secondNumber[i] = atoi(buffer);
    }
 
    if(firstNumberLength > secondNumberLength)
    {
        maxLength = firstNumberLength;
        minLength = secondNumberLength;
    }
    else
    {
        maxLength = secondNumberLength;
        minLength = firstNumberLength;
    }
 
    result = new char[maxLength+1];
 
    for(i = 0;i < (maxLength+1);i++)
    {
        if(i < firstNumberLength)
            tmp = firstNumber[(firstNumberLength - 1) - i];
        else
            tmp = 0;
 
        if(i < secondNumberLength)
            tmp += secondNumber[(secondNumberLength - 1) - i];
        else
            tmp += 0;
 
        tmp += ext;
 
        ext = tmp/10;
        tmp = tmp%10;
        result[(maxLength) - i] = tmp;
    }
 
    for(i = 0;i < maxLength+1;i++)
    {
        itoa((int)result[i],buffer,10);
        result[i] = buffer[0];
    }
 
    result[i] = 0;// null-terminated string
    cout<<result<<endl;
}

 

پاسخ داده شده اسفند 23, 1392 بوسیله ی Ali Rahbar (امتیاز 4,240)   6 16 46
...