www.gusucode.com > C++四柱汉诺塔源代码-源码程序 > C++四柱汉诺塔源代码-源码程序/code/Number.cpp

    //Download by http://www.NewXing.com
// Number.cpp: implementation of the Number class.
//
//////////////////////////////////////////////////////////////////////

#include "Number.h"
#include <string.h>
#include <iostream>

#define max(a,b) (a>b ? a:b)

using namespace std;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

Number::Number()
{
	data = new char[2];
	data[0] = '0';
	data[1] = '\0';
}

Number::Number(int num)
{
	int len = 1;
	int quotient = num;
	while((quotient = quotient/10) != 0)
	{
		len++;
	}
	data = new char[len+1];
	data[len] = '\0';
	len--;
	quotient = num;
	for(;len>=0;len--)
	{
		data[len] = quotient%10+'0';
		quotient = quotient/10;
	}
}

Number::Number(Number &other)
{
	int length = strlen(other.data);
	data = new char[length+1];
	strcpy(data, other.data);
}

Number::~Number()
{
	if (data != NULL)
	{
		delete []data;
		data = NULL;
	}
}

Number & Number::operator =(const Number &other)
{
	if (this == &other)
	{
		return *this;
	}
	
	delete []data;

	int length = strlen(other.data);
	data = new char[length+1];
	strcpy(data, other.data);

	return *this;
}

Number Number::operator +(const Number &other)
{
	int length1 = strlen(data);
	int length2 = strlen(other.data);
	int maxLen = max(length1, length2);
	int overflow = 0;
	int sum = 0;
	Number num;
	
	if (length1<length2)
	{
		delete []num.data;
		num.data = new char[length2+2];
		num.data[length2+1] = '\0';
		length1--;
		length2--;
		while(length1>=0)
		{
			sum = data[length1]-'0'+other.data[length2]-'0'+overflow;
			overflow = sum/10;
			sum = sum%10;
			num.data[length2+1] = sum+'0';
			length1--;
			length2--;
		}
		while(length2>=0)
		{
			sum = other.data[length2]-'0'+overflow;
			overflow = sum/10;
			sum = sum%10;
			num.data[length2+1] = sum+'0';
			length2--;
		}
		if (overflow != 0)
		{
			num.data[0] = '0'+overflow;
		} 
		else
		{
			char *newData = new char[maxLen+1];
			strcpy(newData, &num.data[1]);
			delete []num.data;
			num.data = newData;
		}
	} 
	else
	{
		delete []num.data;
		num.data = new char[length1+2];
		num.data[length1+1] = '\0';
		length1--;
		length2--;
		while(length2>=0)
		{
			sum = data[length1]-'0'+other.data[length2]-'0'+overflow;
			overflow = sum/10;
			sum = sum%10;
			num.data[length1+1] = sum+'0';
			length1--;
			length2--;
		}
		while(length1>=0)
		{
			sum = data[length1]-'0'+overflow;
			overflow = sum/10;
			sum = sum%10;
			num.data[length1+1] = sum+'0';
			length1--;
		}
		if (overflow != 0)
		{
			num.data[0] = '0'+overflow;
		} 
		else
		{
			char *newData = new char[maxLen+1];
			strcpy(newData, &num.data[1]);
			delete []num.data;
			num.data = newData;
		}
	}
	return num;
}

Number & Number::operator *(const Number &other)
{
	return *this;
}

int Number::Compare(const Number &other) const
{
	int nLen1 = strlen(data);
	int nLen2 = strlen(other.data);
	if (nLen1 > nLen2)
	{
		return 1;
	}
	else if (nLen1 < nLen2)
	{
		return -1;
	} 
	else
	{
		return strcmp(data, other.data);
	}
}


const Number & Number::MinNum(const Number &num1, const Number &num2)
{
	if (num1.Compare(num2) < 0)
	{
		return num1;
	}
	else
	{
		return num2;
	}
}

void Number::Print(void)
{
	cout<<data<<endl;
}