大資料運算

2021-08-09 03:37:48 字數 3611 閱讀 7003

1、大數的資料型別設計

可以用乙個string和乙個long long型別來表示乙個大數型別,long long型別表示沒有超出範圍,string表示超出範圍的大數。在初始化的時候我們可以將string和long long都進行初始化,在運算的時候再判斷是用long long運算還是用string進行運算。

typedef long long init64;

class bigdata

;1.1、用乙個整數初始化大數物件,其中sprintf的作用就相當於itoa.

bigdata::bigdata(init64 value)

:_value(value)

; sprintf(buf,"%lld",_value);

_strdata =buf;

}1.2、用乙個字串初始化乙個大數物件,考慮到輸入的字串可能有各種異常情況,比如前面一空白字元或0開頭,出現字母等等,我們將常見的異常情況過濾掉(可以參考atoi是怎麼進行過濾的)。

bigdata::bigdata(string strdata)

:_value(0)

, _strdata("+0")

if (*pdata)

_strdata.resize(count);

if (symbol == '-')

_value = 0 - _value;

}1.3、判斷乙個大數是不是超出範圍,因為整數的最大資料型別是long long型別,我們必須用string中的值進行判斷,判斷大數是不是超出範圍。

bool bigdata::isinit64overflow(const string& strdata)

return true;

}ostream& operator<<(ostream& os, const bigdata& b)

2、加法的實現

bigdata bigdata::operator+(bigdata b)

}else if ('-' == _strdata[0] && '-' == b._strdata[0])}}

if (_strdata[0] == b._strdata[0]) //同號相加

return bigdata(add(_strdata, b._strdata));

else //異號相加可以轉換成減法

}string bigdata::add(string strleft,string strright)

string strtemp;

strtemp.resize(lsize+1); //兩個數相加,結果的位數最長是兩個運算數中位數最長的運算數加+1

strtemp[0] = strleft[0];

char step = 0; //記錄進製

for (size_t index = 1; index < lsize;index++)

step = ret / 10; //儲存進製情況

strtemp[lsize + 1 - index] = ret%10+'0';

}strtemp[1] = step+'0'; //向最高位進製,取決於step的值

return strtemp;

}3、減法的實現參考加法

4、乘法的實現

bigdata bigdata::operator * (bigdata b)

else

}//判斷運算數中有沒有為正負1的特殊情況

if ("+1"==_strdata)

return bigdata(b._strdata);

if ("+1" == b._strdata)

return bigdata(_strdata);

if ("-1" == _strdata)

if ("-1" == b._strdata)

return bigdata(mul(_strdata, b._strdata));

}string bigdata::mul(string strleft, string strright)

char symbol = '+';

if (strleft[0] != strright[0]) //異號相乘為負

symbol='-';

string strtemp;

strtemp.resize(lsize+rsize-1,'0'); //兩數相乘,結果的位數最長是兩個運算數字數之和

strtemp[0] = symbol;

//因為兩個數相乘,即乘數的每一位都要和被乘數相運算,所以必須用兩個迴圈

for (size_t i = 1; i < lsize;i++)

//考慮一些特殊情況

if (!isinit64overflow(_strdata) && !isinit64overflow(b._strdata))

if ("+0" == _strdata || _strdata.size()strncmp(_strdata.c_str()+1,b._strdata.c_str()+1,_strdata.size()-1)<0))

return bigdata(0);

if (_strdata.size() == b._strdata.size() && strncmp(_strdata.c_str() + 1, b._strdata.c_str() + 1, _strdata.size() - 1)==0)

if ("+1" == b._strdata)

return bigdata(_strdata);

else

if ("-1" == b._strdata)

return bigdata(div(_strdata,b._strdata));

}string bigdata::div(string strleft, string strright)

if (!islgtr(pleft, datalen, pright, rsize-1))

else

}return strtemp;

}char bigdata::subloop(char* &pleft, size_t& datalen, const

char *pright,const size_t rsize)

if (ret < 0)

*(pleft + datalen - index) = ret + '0';

}count++;

while ('0' == *pleft&&datalen>0)

}return count;

}//判斷以pleft開始datalen長度所表示的數的大小是不是大於除數

bool bigdata::islgtr(const

char* pleft,const size_t datalen, const

char *pright, const size_t rsize)

return

false;

}

java大資料運算

大數運算類似的文章有很多,本文主要分享一下自己的經驗。把實現思路寫一下,希望能夠幫助到有需要的人。關於整數的運算通常有byte short int long,當時數字有20位或者更長的時候,原有的資料型別已經不能使用,所以需要大數的運算,實現如下 實現大數的運算 通過byte陣列運算,實現了進製的靈...

大數運算之大數相減

大數減法運算 第一次在csdn寫部落格,督促自己不斷學習 鞏固和進步,希望能和大家一起成長 在程式設計實現整數運算時,作為程式猿 媛,我們知道計算機中的int long或者long long的所佔的記憶體空間是有限的,當整數超過一定大小,這些型別就無法表示整數的值,否則資料會被 截斷 無法得到正確的...

大數運算 冪次方運算

以下演算法計算n的m次方 m的定義域是 1,2 31 n的定義域是 0,65535 原理就是按位相乘,處理進製 include include include void main void std vectorvecnum 1,n 用vector儲存大數,首位賦n for int i 0 i m 1...