#include <stdio.h>
#include <math.h>
#include <iostream>
using namespace std;
class decnum
{
friend decnum pow(const decnum& x, int n);
friend decnum root(const decnum& x, int n);
friend decnum div(const decnum& x, const decnum& y, decnum& r);
friend decnum abs(const decnum& x);
friend bool operator==(const decnum& x, const decnum&y);
friend bool operator!=(const decnum& x, const decnum&y);
friend bool operator>(const decnum& x, const decnum&y);
friend bool operator<(const decnum& x, const decnum&y);
friend bool operator>=(const decnum& x, const decnum&y);
friend bool operator<=(const decnum& x, const decnum&y);
friend ostream& operator<<(ostream&os, const decnum& x);
public:
decnum() : cap(0), num(0), sign(0), val(NULL) { }
decnum(const char *v, int n)
{
int i, j,k;
val = new char[n];
if(v[0] == '-')
{
sign = 1;
v++;
n--;
}
else
{
sign = 0;
if(v[0] == '+')
v++;
}
for(i = 0; i < n && v[i] == '0'; i++);
for (j=0,k=n-1;k>=i;--k,++j)
{
if (v[k]>='0' && v[k]<='9')
{
val[j] = v[k]-'0';
}
else
break;
}
num = j;
cap = n;
}
decnum(const decnum& x)
{
val = new char[x.num];
memcpy(val, x.val, x.num);
sign = x.sign;
num = x.num;
cap = x.num;
}
decnum(int x)
{
if(x==0)
{
cap = num = 0;
val = NULL;
return;
}
if(x < 0)
{
sign = 1;
x = -x;
}
else
sign = 0;
char temp[20];
sprintf(temp, "%d", x);
int n = strlen(temp);
num = cap = n;
val = new char[n];
for(int i=0; i<n; i++)
val[i] = temp[n-1-i] - '0';
}
decnum(long long x)
{
if(x==0)
{
cap = num = 0;
val = NULL;
return;
}
if(x < 0)
{
sign = 1;
x = -x;
}
else
sign = 0;
char temp[20];
sprintf(temp, "%lld", x);
int n = strlen(temp);
num = cap = n;
val = new char[n];
for(int i=0; i<n; i++)
val[i] = temp[n-1-i] - '0';
}
~decnum() { delete[] val; }
int size() const { return num; }
decnum& operator=(const decnum& x)
{
if (this != &x)
{
if(cap < x.num)
{
delete[] val;
val = new char[x.num];
cap = x.num;
}
memcpy(val, x.val, x.num);
num = x.num;
sign = x.sign;
}
return *this;
}
decnum& operator=(int x)
{
*this = decnum(x);
return *this;
}
decnum& operator=(long long x)
{
*this = decnum(x);
return *this;
}
decnum& abs()
{
sign = 0;
return *this;
}
decnum& operator+=(const decnum& x);
decnum& operator-=(const decnum& x);
decnum& operator*=(const decnum& x);
decnum& operator/=(const decnum& x);
decnum& operator%=(const decnum& x);
decnum operator+(const decnum& x) const;
decnum operator-(const decnum& x) const;
decnum operator*(const decnum& x) const;
decnum operator/(const decnum& x) const;
decnum operator%(const decnum& x) const;
bool ispow(int n, decnum& r) const;
bool ispow() const;
private:
int cap;
int num;
int sign;
char *val;
private:
char root_1(int n);
decnum& absadd(const decnum& x);
decnum& abssub(const decnum& x);
bool absge(const decnum& x);
};
复制代码
实现代码
大数类实现代码
测试代码:
复制代码
#include <iostream>
#include <string>
using namespace std;
#include "decnum.h"
int main()
{
decnum x, y, r;
string line;
size_t n = 0;
cout << "input x:" << endl;
getline(cin,line);
x = decnum(line.c_str(), line.length());
cout << "input y:" << endl;
getline(cin,line);
y = decnum(line.c_str(), line.length());
cout << "x = " << x << endl;
cout << "y = " << y << endl;
cout << "x * y =" << x * y << endl;
cout << "x / y =" << x / y << endl;
cout << "x % y =" << x % y << endl;
cout << "div(x, y) =" << div(x , y, r) << endl;
cout << "mod(x, y) =" << r << endl;
cout << "y ^ 2 =" << pow(y, 2) << endl;
cout << "x ^ 1/2 =" << root(x, 2) << endl;
cout << "x is pow = " << x.ispow() << endl;
system("pause");
return 0;
}
复制代码
本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2008/11/12/1332344.html,如需转载请自行联系原作者