题目:
设计一个CBigInteger类,它可以保存超过32位,64位的数,例如你可以把1024个数字的数存在这样的一个类中。这个类的构造函数可以接受文件输入,即可以从一个文件中读入一个很长的数。假设文件中的数按10进制格式存储,格式为: 12345678901234567909………. ;且一个文件中只存一个数。数中间可以有空格、逗号,文件结束意味着数结束。再假设我们只关心正整数。 除去上面的之外,设计的CBigInteger类应该支持operator+运算,即必须完成:
CBigInteger operator+( CBiginteger& AnotherBigInteger)类似的成员函数。
测试上面的类,使用两个保存数的文本文件(文件自己建立),其中一个中 间有512个数字,另一个中间有256个数字。 程序要能够把两个数的和打印出来。
希望大虾们尽快写出来
根据您的要求写出如下代码:
头文件
#include <iostream>
#include <string>
using namespace std;
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
class CBigInteger
{
public:
CBigInteger();
CBigInteger(const char* data);
virtual ~CBigInteger();
char* GetData(char* ret);
void Show();
void Set(const char* data);
int GetSize();
CBigInteger operator+(const CBigInteger& data);
CBigInteger operator=(const CBigInteger& data);
private:
char data[MAX_DATA_NUM];
};
源文件:
CBigInteger::CBigInteger()
{
memset(data, 0, MAX_DATA_NUM);
}
CBigInteger::~CBigInteger()
{
}
CBigInteger::CBigInteger(const char* data)
{
memcpy(this->data, data, MAX_DATA_NUM);
}
void CBigInteger::Show()
{
cout<<data<<endl;
}
void CBigInteger::Set(const char* data)
{
memset(this->data, 0, MAX_DATA_NUM);
memcpy(this->data, data, strlen(data));
}
int CBigInteger::GetSize()
{
return strlen(data);
}
CBigInteger CBigInteger::operator+(const CBigInteger& data)
{
int start = clock();
int i;
CBigInteger tempbig = data;
int maxsize = GetSize()>tempbig.GetSize()?GetSize():tempbig.GetSize();
int minsize = GetSize()<tempbig.GetSize()?GetSize():tempbig.GetSize();
int retsize = maxsize + 1;
char* maxchars = new char[maxsize];
char* minchars = new char[minsize];
if(GetSize() > tempbig.GetSize())
{
memcpy(maxchars, this->data, maxsize);
memcpy(minchars, tempbig.data, minsize);
}
else
{
memcpy(minchars, this->data, minsize);
memcpy(maxchars, tempbig.data, maxsize);
}
int* maxdatas = new int[maxsize];
int* mindatas = new int[minsize];
int* retdatas = new int[retsize];
for(i=0; i<maxsize; i++)
{
maxdatas[i] = maxchars[i]-'0';
retdatas[i+1] = maxchars[i]-'0';
}
retdatas[0] = 0;
for(i=0; i<minsize; i++)
{
mindatas[i] = minchars[i]-'0';
}
for(i=0; i<minsize; i++)
{
retdatas[i+retsize-minsize] = maxdatas[i+maxsize-minsize] + mindatas[i];
}
for(i=retsize-1; i>=1; i--)
{
if(10 <= retdatas[i])
{
retdatas[i-1]+=retdatas[i]/10;
retdatas[i] = retdatas[i]%10;
}
}
char* retchars = new char[retsize+1];
memset(retchars, 0, retsize+1);
if(0 != retdatas[0])
{
for(i=0; i<retsize; i++)
{
retchars[i] = retdatas[i]+'0';
}
}
else
{
for(i=1; i<retsize; i++)
{
retchars[i-1] = retdatas[i]+'0';
}
}
memcpy(this->data, retchars, retsize+1);
delete[] maxdatas;
delete[] mindatas;
delete[] retdatas;
delete[] maxchars;
delete[] minchars;
delete[] retchars;
return *this;
}
CBigInteger CBigInteger::operator=(const CBigInteger& data)
{
memcpy(this->data, data.data, MAX_DATA_NUM);
return *this;
}
char* CBigInteger::GetData(char* ret)
{
if(strlen(ret) > MAX_DATA_NUM)
return NULL;
for(int i=0; i<strlen(ret); i++)
{
ret[i] = data[i];
}
return ret;
}
主函数:
void main()
{
FILE* fp1 = fopen("file1.txt", "r");
FILE* fp2 = fopen("file2.txt", "r");
if(!fp1 || !fp2)
{
cout<<"Open file faild!\n";
return;
}
char data1[MAX_DATA_NUM] = {0};
char data2[MAX_DATA_NUM] = {0};
fgets(data1, MAX_DATA_NUM, fp1);
fgets(data2, MAX_DATA_NUM, fp2);
printf("data1: %s\n\n\n", data1);
printf("data2: %s\n\n\n", data2);
CBigInteger big(data1);
CBigInteger big2(data2);
CBigInteger big3;
start = clock();
big3 = big+big2;
end = clock();
cout<<"The result of "<<data1<<"+"<<data2<<" is: ";
big3.Show();
fclose(fp1);
fclose(fp2);
printf"Use time %f\n",(double)(end-start)/CLOCKS_PER_SEC/1000);
}