当前位置:编程学习 > C/C++ >>

c++整数类问题

C++编程,编写一个整数类,实现大数(超过long类型的整型数据)的加法,减法,乘法,还有阶乘。
答案:#include<iostream>
using namespace std;
class integer
{
protected:
 char num[2000];
 int len;
public:
    integer(integer &i);
    integer(){};
    bool isNegative();//判断是否为负数,若是负数则返回true
    void remove();//消去负号
    void add();//增加负号
    void reduce(long n);
 friend integer& operator*(integer &i1,integer &i2);
 friend integer& operator+(integer &i1,integer &i2);
 friend integer& operator-(integer &i1,integer &i2);
 friend integer& operator>>(istream &input,integer &i);
 friend ostream& operator<<(ostream &output,integer &i);
};
integer::integer(integer &i)
{
   for(int j=0;j<i.len;j++)
        num[j]=i.num[j];
   len=i.len;
}
void integer::add()
{
    for(int i=len;i>=0;i--)
        num[i]=num[i-1];
    num[0]='-';
    len++;
}
void integer::remove()
{
    for(int i=0;i<len-1;i++)
        num[i]=num[i+1];
 len--;
}
bool integer::isNegative()
{
    if(num[0]=='-') return true;
    else return false;
}
integer& operator-(integer &i1,integer &i2)
{
 integer s;
 integer u;
 u=i1;
 int c[2002]={0},i,j;
 int len1,len2,t=0,temp,count=0,num=0;
 if(!i1.isNegative()&&i2.isNegative())
 {
  i2.remove();
  s=i1+i2;
  i2.add();
  return s;
 }
 else if(i1.isNegative()&&!i2.isNegative())
 {
  i2.add();
  s=i1+i2;
  i2.remove();
  return s;
 }
 else if(i1.isNegative()&&i2.isNegative())
 {
  i2.remove();
  s=i1+i2;
  i2.add();
  return s;
 }
 len1=u.len;
 len2=i2.len;
 if(len1>len2 ||(len1==len2&&strcmp(u.num,i2.num)>0))
 {
  for(i=len1-1,j=len2-1;i>=0||j>=0;i--,j--)
  {
   if(i>=0 && j>=0)
    temp=(int(u.num[i]-48)-int(i2.num[j]-48));
   else if(i>=0&&j<0)
    temp=int(u.num[i]-48);
   else if(i<0 &&j>=0)
    temp=int(i2.num[j]-48);
   if(temp<0)
   {
    c[t]=c[t]+(temp+10);
    u.num[i-1]=u.num[i-1]-1;
   }
   else c[t]=c[t]+temp;
   t++;
  }
 }
 else if(len1<len2 ||(len1==len2&&strcmp(i1.num,i2.num)<0) )
 {  
  s.num[count++]='-';
  for(i=len2-1,j=len1-1;i>=0||j>=0;i--,j--)
  {
   if(i>=0 && j>=0)
    temp=(int(i2.num[i]-48)-int(i1.num[j]-48));
   else if(i>=0&&j<0)
    temp=int(i2.num[i]-48);
   else if(i<0 &&j>=0)
    temp=int(i1.num[j]-48);
   if(temp<0)
   {
    c[t]=c[t]+(temp+10);
    i2.num[i-1]=i2.num[i-1]-1;
   }
   else c[t]=c[t]+temp;
   t++;
  }
 }
 for(i=t;i>=0;i--)
 {
  if(c[i]==0 &&i!=0 && num==0)
   continue;
  num=1;
  s.num[count++]=char(c[i]+48);
 }
 s.len=count;
 return s;
}
integer& operator*(integer &i1,integer &i2)
{
 integer s;
 int c[2002]={0},i,j;
 int t=0,temp,count=0,num=0;
 if(i1.isNegative()&&!i2.isNegative())
  s.num[count++]='-';
 else if(!i1.isNegative()&&i2.isNegative())
  s.num[count++]='-';
 for(i=i2.len-1;i>=0&&i2.num[i]!='-';i--)
 {
  t=i2.len-1-i;
  for(j=i1.len-1;j>=0&&i1.num[j]!='-';j--)
  {
   temp=(int(i2.num[i]-48)*int(i1.num[j]-48));
   c[t]=c[t]+temp;
   if(c[t]>=10)
   {
    c[t+1]=c[t+1]+(c[t]/10);
    c[t]=c[t]%10;
   }
   t++;
  }
 }
 for(i=t;i>=0;i--)
 {
  if(c[i]==0 &&i!=0 && num==0)
   continue;
  num=1;
  s.num[count++]=char(c[i]+48);
 }
 s.len=count;
 return s;
}
integer& operator+(integer &i1,integer &i2)
{
 integer s;
 int c[2002]={0},i,j,flag=0;
 int len1,len2,t=0,temp,count=0,num=0;
 if(i1.isNegative()&&!i2.isNegative())
 {
  i1.remove();
  s=i2-i1;
  i1.add();
  return s;
 }
 else if(!i1.isNegative()&&i2.isNegative())
 {
  i2.remove();
  s=i1-i2;
  i2.add();
  return s;
 }
 else if(i1.isNegative()&&i2.isNegative())
 {
  i1.remove();
  i2.remove();
  s.num[count++]='-';
  flag=1;  
 }
 len1=i1.len;
 len2=i2.len;
 for(i=len1-1,j=len2-1;i>=0||j>=0;i--,j--)
 {
  if(i>=0 && j>=0)
   temp=(int(i1.num[i]-48)+int(i2.num[j]-48));
  else if(i>=0&&j<0)
   temp=int(i1.num[i]-48);
  else if(i<0 &&j>=0)
   temp=int(i2.num[j]-48);
  c[t]=c[t]+temp;
  if(c[t]>=10)
  {
   c[t+1]=c[t+1]+(c[t]/10);
   c[t]=c[t]%10;
  }
  t++;
 }
 for(i=t;i>=0;i--)
 {
  if(c[i]==0 &&i!=0 && num==0)
   continue;
  num=1;
  s.num[count++]=char(c[i]+48);
 }
 if(flag)
 {
  i1.add();
  i2.add();
  flag=0;
 }
 s.len=count;
 return s;
}
integer& operator>>(istream &input,integer &i)
{
    gets(i.num);
    i.len=strlen(i.num);
    return i;
}
ostream& operator<<(ostream &output,integer &i)
{
    for(int j=0;j<i.len||i.num[j]=='-';j++)
        {
            if(i.num[j]=='-'&&i.num[j+1]=='0') continue;
            output<<i.num[j];
        }
 return output;
}
void integer::reduce(long n)
{
    long t=n;
    int count1=0,count2=0;
    int c[1000];
 while(t)
 {
     c[count1++]=t%10;
     t=t/10;
 }
 for(int i=count1-1;i>=0;i--)
  &nbs

上一个:C++的发展历史
下一个:C++找字符串直接后继

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,