红楼梦的张莉是军人吗:急求C++高手!

来源:百度文库 编辑:高校问答 时间:2024/04/27 08:14:25
我有一个难题不知道怎么做,请各位高人帮我做一下,跪谢!
编写一个HugeInt类,用整型数组存放一个不超过30位的整数,要求成员函数实现以下功能:
(1)两个HugeInt类相加,结果仍为HugeInt类。
(2)两个HugeInt类相减,结果仍为HugeInt类。
(3)两个HugeInt类相乘,结果仍为HugeInt类,判断是否溢出。
(4)两个HugeInt类相除,结果仍为HugeInt类。
(5)比较两个HugeInt类的大小。
(6)判断两个HugeInt类是正数还是负数。
此题是我们我上机实验作业,马上就要上交了,请各位高人帮我做一下啊 (希望写的编译可以通过)
继续等待C++精英的出现啊
上面两位仁兄,一个没看懂题意,一个书写太恐怖了,空格都省了,而且我改了一下午,编译还是不能通过,问题太多了
我马上就要上交了,请高手帮帮我啊

上面我发错了

#include "stdafx.h"
#include "math.h"
using namespace std;

class HugeInt
{
public:
HugeInt();
void SetData(char *StrNum);
HugeInt jian(HugeInt&,HugeInt&);
HugeInt operator+(HugeInt&);
HugeInt operator-(HugeInt&);
HugeInt operator*(HugeInt&);
HugeInt operator/(HugeInt&);
bool operator>(HugeInt&);
friend ostream& operator<<(ostream&,HugeInt&);
public:
char *str;
int num[5];
bool iszheng;

};

HugeInt::HugeInt()
{
for(int i=0;i<5;i++) num[i]=0;
str="";
iszheng=true;
}
void HugeInt::SetData(char *StrNum)
{
str = StrNum;
if(str[0]=='-')
{
iszheng=false;
str=str+1;
}
int size = (int)strlen(str);

for(int i=0;i<size;i++)
num[i/8]+=(str[size-1-i]-'0')*(int)pow(10,i%8);

}
bool HugeInt::operator>(HugeInt& op)
{
if(iszheng > op.iszheng)
return true;
else if(iszheng<op.iszheng)
return false;

for(int i=3;i>0;i--)
if(num[i] != op.num[i])
break;
return (num[i]>op.num[i]) && (iszheng && iszheng);
}

HugeInt HugeInt::operator+(HugeInt& op)
{

HugeInt Temp;
int TempInt;

if(iszheng>op.iszheng)
{
op.iszheng=!op.iszheng;
Temp=(*this-op);
op.iszheng=!op.iszheng;
return Temp;
}
else if(iszheng<op.iszheng)
{
iszheng=!iszheng;
Temp=op-*this;
iszheng=!iszheng;
return Temp;
}

for(int i=0;i<4;i++)
{
TempInt = Temp.num[i]+op.num[i]+num[i];
Temp.num[i] = TempInt%100000000;
Temp.num[i+1]=TempInt/100000000;
}
if(Temp.num[4]!=0)Temp.num[4]=1111111111;
if(! iszheng && !op.iszheng)
Temp.iszheng=false;
return Temp;
}

HugeInt HugeInt::operator-(HugeInt& op)
{
HugeInt Temp;
if(iszheng!=op.iszheng)
{
op.iszheng=!op.iszheng;
Temp=*this+op;
op.iszheng=!op.iszheng;
return Temp;
}
/**
else if(iszheng < op.iszheng)
{
op.iszheng=!op.iszheng;
return (*this+op);
op.iszheng=!op.iszheng;
}
**/
if(*this>op)
Temp=jian(*this,op);
else
{
Temp=jian(op,*this);
Temp.iszheng=false;
}

return Temp;
}

HugeInt HugeInt::jian(HugeInt& Big,HugeInt& Small)
{
HugeInt Temp;
for(int i=0;i<4;i++)
{
if(Big.num[i]+Temp.num[i]<Small.num[i])
{
Temp.num[i+1]--;
Temp.num[i]+=100000000;
}
Temp.num[i]=Big.num[i]+Temp.num[i]-Small.num[i];
}

return Temp;
}

HugeInt HugeInt::operator*(HugeInt& op)
{

HugeInt Temp;
int a[8]={0},b[8]={0},c[8]={0};
for(int i=0;i<4;i++) //不好意思,因开头定义不好下面好复杂
{
a[2*i]=num[i]%10000;
a[2*i+1]=num[i]/10000;
b[2*i]=op.num[i]%10000;
b[2*i+1]=op.num[i]/10000;
}

int TempInt=0;
for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++)
{
TempInt=a[j]*b[i];
if((TempInt!=0) && (j+i)<8)
{
c[j+i+1]+=(c[j+i]+TempInt)/10000;
c[j+i]=(c[j+i]+TempInt)%10000;
}
}
if(c[7]/100!=0)
break;
}

if(i!=8)
Temp.num[4]=1111111111;
else
for(int i=0;i<4;i++)
Temp.num[i]=c[2*i]+c[2*i+1]*10000;
Temp.iszheng = bool(op.iszheng * iszheng);

return Temp;
}

HugeInt HugeInt::operator/(HugeInt& op) //用减法做除法,好慢
{
HugeInt Temp,tmp=*this;
bool stop=true;
if(op>*this)
return Temp;

while(stop)
{
tmp=jian(tmp,op);
Temp.num[0]++;
for(int i=0;i<4;i++)
{
if(Temp.num[i]==100000000)
{
Temp.num[i]=0;
Temp.num[i+1]++;
}
}
if(Temp.num[4]!=0)
{
Temp.num[4]=1111111111;
break;
}
if(op>tmp)
break;

}
Temp.iszheng = bool(op.iszheng * iszheng);

return Temp;
}

ostream& operator<<(ostream& out, HugeInt& op)
{
if(op.num[4]==1111111111)
return out << "溢出";

int i,j;
char *zero="00000000";
for(i=4;i>0;i--)
if(op.num[i]!=0)
break;
if(!op.iszheng) out<<"-";
cout<<op.num[i];
for(j=i-1;j>=0;j--)
{
if(op.num[j]<10000000)
{
for(int k=7;k>-1;k--)
{
if(pow(10,k)>op.num[j])
cout<<"0";
else
break;
}
}
if(op.num[j]!=0)
out<<op.num[j];
}

return out<<endl;

}

int _tmain(int argc, _TCHAR* argv[])
{
HugeInt a,b;
a.SetData("4545454545445445");
b.SetData("72424544545554");
cout << a+b << a-b<< a*b <<a/b << (a>b)<<endl;

if(a.iszheng)
cout<<"a 正"<<endl;
else
cout<<"a 负"<<endl;
if(b.iszheng)
cout<<"b 正"<<endl;
else
cout<<"b 负"<<endl;
return 0;
}

用整型数组存放一个不超过30位的整数?什么意思?

程序有点出错,但不知是不是这样?
.net2003

#include "stdafx.h"
#include "math.h"
using namespace std;

class HugeInt
{
public:
HugeInt();
void SetData(char *StrNum);
HugeInt jian(HugeInt&,HugeInt&);
HugeInt operator+(HugeInt&);
HugeInt operator-(HugeInt&);
HugeInt operator*(HugeInt&);
HugeInt operator/(HugeInt&);
bool operator>(HugeInt&);
friend ostream& operator<<(ostream&,HugeInt&);
public:
char *str;
int num[5];
bool iszheng;

};

HugeInt::HugeInt()
{
for(int i=0;i<5;i++) num[i]=0;
str="";
iszheng=true;
}
void HugeInt::SetData(char *StrNum)
{
str = StrNum;
if(str[0]=='-')
{
iszheng=false;
str=str+1;
}
int size = (int)strlen(str);

for(int i=0;i<size;i++)
num[i/8]+=(str[size-1-i]-'0')*(int)pow(10,i%8);

}
bool HugeInt::operator>(HugeInt& op)
{
if(iszheng > op.iszheng)
return true;
else if(iszheng<op.iszheng)
return false;

for(int i=3;i>0;i--)
if(num[i] != op.num[i])
break;
return (num[i]>op.num[i]) && (iszheng && iszheng);
}

HugeInt HugeInt::operator+(HugeInt& op)
{

HugeInt Temp;
int TempInt;

if(iszheng>op.iszheng)
{
op.iszheng=!op.iszheng;
Temp=(*this-op);
op.iszheng=!op.iszheng;
return Temp;
}
else if(iszheng<op.iszheng)
{
iszheng=!iszheng;
Temp=op-*this;
iszheng=!iszheng;
return Temp;
}

for(int i=0;i<4;i++)
{
TempInt = Temp.num[i]+op.num[i]+num[i];
Temp.num[i] = TempInt%100000000;
Temp.num[i+1]=TempInt/100000000;
}
if(Temp.num[4]!=0)Temp.num[4]=1111111111;
if(! iszheng && !op.iszheng)
Temp.iszheng=false;
return Temp;
}

HugeInt HugeInt::operator-(HugeInt& op)
{
HugeInt Temp;
if(iszheng!=op.iszheng)
{
op.iszheng=!op.iszheng;
Temp=*this+op;
op.iszheng=!op.iszheng;
return Temp;
}
/**
else if(iszheng < op.iszheng)
{
op.iszheng=!op.iszheng;
return (*this+op);
op.iszheng=!op.iszheng;
}
**/
if(*this>op)
Temp=jian(*this,op);
else
{
Temp=jian(op,*this);
Temp.iszheng=false;
}

return Temp;
}

HugeInt HugeInt::jian(HugeInt& Big,HugeInt& Small)
{
HugeInt Temp;
for(int i=0;i<4;i++)
{
if(Big.num[i]+Temp.num[i]<Small.num[i])
{
Temp.num[i+1]--;
Temp.num[i]+=100000000;
}
Temp.num[i]=Big.num[i]+Temp.num[i]-Small.num[i];
}

return Temp;
}

HugeInt HugeInt::operator*(HugeInt& op)
{

HugeInt Temp;
int a[8]={0},b[8]={0},c[8]={0};
for(int i=0;i<4;i++) //不好意思,因开头定义不好下面好复杂
{
a[2*i]=num[i]%10000;
a[2*i+1]=num[i]/10000;
b[2*i]=op.num[i]%10000;
b[2*i+1]=op.num[i]/10000;
}

int TempInt=0;
for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++)
{
TempInt=a[j]*b[i];
if((TempInt!=0) && (j+i)<8)
{
c[j+i]=(c[j+i]+TempInt)%10000;
c[j+i+1]=(c[j+i+1]+TempInt)/10000;
}
}
if(c[7]/1000!=0 && j+1>7)
break;
}

if(i!=8)
Temp.num[4]=1111111111;
else
for(int i=0;i<4;i++)
Temp.num[i]=c[2*i]+c[2*i+1]*10000;
Temp.iszheng = bool(op.iszheng * iszheng);

return Temp;
}

HugeInt HugeInt::operator/(HugeInt& op) //用减法做除法,好慢
{
HugeInt Temp,tmp=*this;
bool stop=true;
if(op>*this)
return Temp;

while(stop)
{
tmp=jian(tmp,op);
Temp.num[0]++;
for(int i=0;i<4;i++)
{
if(Temp.num[i]==100000000)
{
Temp.num[i]=0;
Temp.num[i+1]++;
}
}
if(Temp.num[4]!=0)
{
Temp.num[4]=1111111111;
break;
}
if(op>tmp)
break;

}
Temp.iszheng = bool(op.iszheng * iszheng);

return Temp;
}

ostream& operator<<(ostream& out, HugeInt& op)
{
if(op.num[4]==1111111111)
return out << "溢出";

int i,j;
for(i=4;i>0;i--)
if(op.num[i]!=0)
break;
if(!op.iszheng) out<<"-";
for(j=i;j>=0;j--)
{
if(op.num[j]!=0)
out<<op.num[j];
else
out<<"00000000";
}

return out<<endl;

}

int _tmain(int argc, _TCHAR* argv[])
{
HugeInt a,b;
a.SetData("-4454544");
b.SetData("45445");

cout << a+b << a-b<< a*b << (a>b)<<endl;

if(a.iszheng)
cout<<"a 正"<<endl;
else
cout<<"a 负"<<endl;
if(b.iszheng)
cout<<"b 正"<<endl;
else
cout<<"b 负"<<endl;
return 0;
}

00000

那么多啊

牛b
我也正在学
谢谢

看看这个代码:
#include <memory.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

int main( int argc, char * argv[] )
{
int n, i, j, len, g, t, zero;
unsigned int *a=0;
a = new unsigned int[10000000];
if(!a)
return 0;

while(1)
{
memset(a, 0, 40000); a[0]=1; len=1;
system("clear");
zero=0;
printf("\nInput the number( -1 to exit):");
scanf("%d", &n);
printf("%d\n", n);
if(n<=-1)
{
delete []a;
return 0;
}

printf("\n");
for(i=2; i<=n; i++)
{
g=0;
for(j=zero; j<len; j++)
{
t=a[j]*i+g;
g=t/10000;
t=t%10000;
a[j]=t;
if((!t)&&(j-zero==1)) ++zero;
}
while(g)
{
a[len++]=g%10000;
g/=10000;
}
}
while(!a[len]) len--;
printf("%d", a[len--]);
while(len>=0) printf("%04d", a[len--]);
//pause();
system("pause");
}
delete [ ]a;

return 0;
}