大整数的加减乘除求余

#include
#include                                
#define N 50                                     //N是计算的位数


class Integer                                    //大整数类  
{
public:
Integer();                                   //构造函数

Integer(int x):i(x){}                        //重载构造函数
                                       //友元函数实现运算符重载
friend Integer operator+(Integer &,Integer &);
friend Integer operator*(Integer &,int );
    friend Integer operator/(Integer &,int );
friend Integer operator-(Integer &,Integer &);
friend int operator%(Integer &,int);
friend ostream& operator<<(ostream&,Integer&);  
protected:
int i;                            //大整数的实际位数
int j;                            //求余,余数
char m[N];                        //存储各个数位上的数
};


Integer::Integer()                   //构造函数(无参)
{
    char ch;
int j;
for(j=0;j<6;j++)                 //空出前六个字符,便于做乘法
m[j]='0';
for(j=6;j {
ch=getchar();
if(ch!=' '&&ch!='\n')        //接收条件
m[j]=ch;
else 
break;                   //遇到空格或者回车则接收结束
}
i=j;                              //把大整数的位数赋给i
}


Integer operator*(Integer &b,int q)    //‘*’的重载
{
Integer m = b;                      
while(--q)                         //化乘为加
b=b+m;
return b;
}


Integer operator/(Integer &b,int q)    //‘/’的重载
{
int j , Q = 0 ;
for( j=6 ; j b.m[j]=b.m[j]-'0';            //按数字存储,待会运算
j = 6 ;
while(j {
Q = Q*10 + b.m[j] ;
if(Q b.m[j] = '0';
else 
{
b.m[j] = Q/q + '0';       //商
Q = Q % q ;               //Q继续取余数
b.j=Q;                    //余数放到数据成员j里面
}
j++;
}
return b;
}


int operator%( Integer &a , int q )       //‘%’的重载
{
    a=a/q;
return a.j ;
}


Integer operator+(Integer &a,Integer &b)  //‘+’的重载
{
int k,t;
Integer c(0);                          
if(a.i>=b.i)                        //c取大者,b取小者
{
c  = a;
c.i= a.i;
}
else 
{
c  = b ;
c.i= b.i;
b  = a ;
}                               
k=c.i;                             //k取大者位数,t取小者位数
t=b.i;
while(--t>=0)                      //对应数位相加直至小者结束
{
--k;
c.m[k]=c.m[k]+b.m[t]-'0';        //依然按字符存储
if(c.m[k]>'9')                   //得十进一
{
   c.m[k]=c.m[k]-10;            //满十取个位
c.m[k-1]=c.m[k-1]+1;         //得十进一
}
}
for(k=c.i-1;k>=6;k--)                //特例,即最后连锁999
if(c.m[k]>'9')
{
c.m[k-1]=c.m[k-1]+1;
c.m[k]  = '0';
}
return c;                           
}


 Integer operator-(Integer &a,Integer &b)    //‘-’的重载
{
int k,t,p=1;
Integer c(0);                     
if(a.i>b.i)                         //c取大者,b取小者
{
c  = a;
c.i= a.i;
}
else if(b.i > a.i) 
{
c  = b  ;
c.i= b.i;
b  = a  ;
p  = 0  ;
}           
else
{
for(k=6;k {
if(a.m[k]>b.m[k])
{
c  = a  ;
c.i= a.i;
break;
}
else if(a.m[k] {
c  = b  ;
c.i= b.i;
b  = a  ;
p  = 0  ;
break;
}
}
c.m[0] = '0' ;
return c;                      //a,b相等,返回c即0
}
k = c.i ;
t = b.i ;
while(--t>=6)                     //对应数位相加直至小者b结束
{
--k;
if(c.m[k] >= b.m[t])
c.m[k] = c.m[k] - b.m[t] +'0' ;
else                             //借一
{
   c.m[k]  = c.m[k] + 10 - b.m[t] + '0';
c.m[k-1]= c.m[k-1]- 1 ;
}
}
if(p==0)
cout<<"-";
return c;                           //返回
}


ostream& operator<<(ostream&output,Integer&p)        //‘<<’重载
{
int j;
    for(j=0;j if(p.m[j]!='0')
{
while(j {                
output<<(int)(p.m[j]-'0');
j++;
}
break;
}
output<<(int)(p.m[j]-'0');             //专为结果为零的准备的
return  output;
}


int main()                            //主函数
{             
int a;
int k;
char m;
cout<<"\t\t\t    ***大整数的相关操作***"< while(1)
{
cout<<"\t\t**********************************************"< cout<<"\t\t菜单:1.加法 2.减法 3.乘法 4.除法 5.求余 0.退出"< cout<<"\t\t**********************************************"< cout<<"\t    请输入选择:   ";
cin>>a;
switch(a)
{
case 1:  
{                     //注意!case 里面若定义变量,则必须用{}
printf("\t    请输入两个操作数:\n\t    ");
Integer p ;
Integer q ;
cout<<"\t    "<<"结果:"< break;
}

case 2:
{
printf("\t    请输入两个操作数:\n\t    ");
Integer p ;
Integer q ;
cout<<"\t    "<<"结果:";
cout< break;
}

case 3:
{
                
                printf("\t    请输入一个大整数和一个普通整数:\n\t    ");
Integer p;
scanf("%d",&k);
m=getchar();           //注意!少此步骤,不能重复,下同                
cout<<"\t    "<<"结果:";
cout< break;
}

case 4:
{
                printf("\t    请输入一个大整数和一个普通整数:\n\t    ");
Integer p;
scanf("%d",&k);
m=getchar();
cout<<"\t    "<<"结果:"<

break;
}

case 5:
{
printf("\t    请输入一个大整数和一个普通整数:\n\t    ");
Integer p;
scanf("%d",&k);
m=getchar();
cout<<"\t    "<<"结果:"< break;
}
        case 0:   return 1;

default:   cout<<"\t\t输入错误,请重新输入\n" ;
}
}
}

你可能感兴趣的:(大整数的加减乘除求余)