開發環境:windows visual studio 2013
專案概述:利用string類實現對大數的讀寫,以及實現大數之間的加、減、乘、除、取模和比較運算。
使用技術:c++、string類。
專案思想:使用c++類將超過c++中能夠儲存最大整型變數(long long int)所能儲存的範圍的數轉換成字串進行儲存,將儲存大數的字串拆開進行分析,逐位進行運算儲存,實現大數間的加、減、乘、除、取模和比較運算。將大數運算分解成單個字元的運算。
bignum.h
#define _crt_secure_no_warnings 1
#pragma once
#include
#include
#include
using
namespace
std;
#define max_int64 9223372036854775807
#define min_int64 -9223372036854775808
typedef
long
long int64;
class bigdata
;
bignum.cpp
#define _crt_secure_no_warnings 1
#include "bignum.h"
bigdata::bigdata(int64 data)
: _value(data)
, _strdata("")
bigdata::bigdata(const
char *_pdata)
else
if (*pdata >= '0'&& *pdata <= '9')
else
while (*pdata == '0')
_strdata.resize(strlen(pdata) + 1);
_value = 0;
_strdata[0] = symbol;
int count = 1;
while (pdata)
else
} if ('-' == symbol)
} bigdata bigdata:: operator+(bigdata& bigdata)
else}}
std::string tmp;
if (_strdata[0] == bigdata._strdata[0])
else
return bigdata(tmp.c_str());
}void bigdata::int64tostring()
while (tmp)
char* left = (char*)(_strdata.c_str()+1);
char* right = (char*)(_strdata.c_str()+_strdata.size()-1);
while (left < right)
}bool bigdata::isint64overflow()const
else
if ((_strdata.size() > tmp.size()) ||
((_strdata.size() == tmp.size())&&(_strdata > tmp)))
return
false;
} std::ostream& operator
<<(std::ostream& _cout, const bigdata& bigdata)
else
_cout << pdata;
} return _cout;
} std::string bigdata::add(std::string left,std::string right)
std::string tmp;
tmp.resize(lsize + 1);
tmp[0] = ch;
char step = 0;
int n = 1;
while (n < lsize)
tmp[lsize - n + 1] = (ret % 10 + '0');
step = ret / 10;
n++;
} tmp[1] = step + '0';
return tmp;
}std::string bigdata::sub(std::string left, std::string right)
else
} std::string tmp;
tmp.resize(lsize);
tmp[0] = symbol;
int n = 1;
while (n < lsize)
if (ret < 0)
tmp[lsize - n] = (ret + '0');
n++;
} return tmp;
}bigdata bigdata::operator-(const bigdata& bigdata)
else
} }
std::string tmp;
if (_strdata[0] != bigdata._strdata[0])
else
return bigdata(tmp.c_str());
} bigdata bigdata::operator*(const bigdata& bigdata)
if (!isint64overflow() && !bigdata.isint64overflow())
} else
} }
return bigdata(mul(_strdata, bigdata._strdata).c_str());
} std::string bigdata::mul(std::string left, std::string right)
char symbol = '+';
if (left[0] != right[0])
string tmp;
tmp.assign(lsize + rsize - 1, '0');
tmp[0] = symbol;
int datalen = tmp.size();
int ioffset = 0;
for (int lidx = 1; lidx < lsize; lidx++)
for (int ridx = 1; ridx < rsize; ridx++)
tmp[datalen - ioffset - rsize] += step;
ioffset++;
} return tmp;
} bigdata bigdata::operator/(const bigdata& bigdata)
if (!isint64overflow() && bigdata.isint64overflow())
return bigdata(div(_strdata, bigdata._strdata).c_str());
} int idx = 0;
std::string bigdata::div(std::string left, std::string right)
if ((lsize < rsize) ||
(lsize == rsize && strcmp(left.c_str() + 1, right.c_str() + 1) < 0))
else
} string tmp;
char *pleft = (char*)(left.c_str() + 1);
char *pright = (char*)(right.c_str() + 1);
int datalen = 1;
lsize -= 1;
for (idx = 0; idx < lsize;)
if (!isleftstrbig(pleft, datalen, pright, rsize - 1))
continue;
}
else
} return tmp;
}bool bigdata::isleftstrbig(char *pleft, size_t lsize, char *pright, size_t rsize)
return
false;
} char bigdata::subloop(char *&pleft, int& lsize, char *pright, size_t rsize)
int ldatalen = lsize - 1;
int rdatalen = rsize - 1;
while (ldatalen >= 0 && rdatalen >= 0)
pleft[ldatalen] = pleft[ldatalen] - pright[rdatalen] + '0';
ldatalen--;
rdatalen--;
} while ((*pleft == '0') && (lsize > 0))
ret++;
} return ret;
}
大數四則運算
include include includeusing namespace std define m 1000000000000000 大數加法 將數字以字串的形式傳入add加法函式,在函式內部完成字串 陣列的轉換,然後在陣列中逐位進行相加,再判斷該位相加後是否需要進製,為了方便計算,我們將數字的...
大數的四則運算
演算法與思路 大數的加,減,乘演算法比較簡單,模擬列豎式的計算過程就好 除法模擬實現比較困難,採用減法的形式實現,例如對於大數a b,如果a b,則直接輸出商為0,否則,將a的最後strlen b 位重複減去b,直到得數小於b,將執行減法的次數賦給商的個位,然後將b的最後添上乙個0,相當於乘以10 ...
大數的四則運算
1.加法 輸入採用字元陣列儲存,然後將輸入存在整形陣列裡,然後逐位相加即可,同時注意進製處理。cpp view plain copy include include intmain b 555 c 555 scanf s m len m strlen m for i 0 i len m 1 i a ...