C 專案 大數四則運算

2021-08-04 13:32:05 字數 4793 閱讀 5971

開發環境: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 ...