生日小窝吧 关注:263贴子:20,848
  • 4回复贴,共1

【再来】= =嗯嗯,这次稍微比之前复杂一点了

只看楼主收藏回复

不过其实是因为我已经完全昏了头不知道怎么使用简洁的算法了......好吧继续.....



#include<iostream.h>
#include<string>
#include<iomanip>
using namespace std;
class bignum
{
public:
bignum(string m); //构造大数
void display();
bignum operator + (bignum a2); //+重载
bignum operator - (bignum a2); //-重载
bignum operator ++ (); //++重载
bignum operator ++ (int); //++后置重载
private:
int length; //大数的位数
int a[1000]; //定义数组存储大数
};

bignum::bignum(string m)
{
length=m.length(); //获得位数
for (int i=0;i<length;i++)
{
a[i]=(int)m[length-1-i]-48; //类型转换
}
}

void bignum::display()
{
if (a[length-1]>0)
{
for (int i=0;i<length;i++)
{
cout<<a[length-1-i];
}
cout<<endl;
}
else if (a[length-1]==0)
{
cout<<'-';
for (int i=0;i<length-2;i++)
{
cout<<a[length-2-i];
}
cout<<endl;
}
else if (a[length-1]==-1)
{
cout<<'-';
for (int i=0;i<length-2;i++)
{
cout<<10-a[length-2-i]-1;
}
cout<<10-a[0]<<endl;
}
else if (a[length-1]<-1)
{
cout<<'-';
cout<<-a[length-1]-1;
for (int i=0;i<length-2;i++)
{
cout<<10-a[length-2-i]-1;
}
cout<<10-a[0]<<endl;
}
}

bignum bignum::operator ++() //实现大数自加运算重载
{
a[0]+=1;
int m=0;
for (int i=0 i<length i++) //循环检查是否需要进位
{
if (a[i]==9) m++; //通过m的值判断是否每一位都是9
if (a[i]>9) {a[i]-=10 a[i+1]+=1 }
}
if (m==length) {length++ a[length-1]=1;}
return *this;
}

bignum bignum::operator ++(int)
{
a[0]++;
int m=0;
for (int i=0 i<length i++) //循环检查是否需要进位
{
if (a[i]==9) m++; //通过m的值判断是否每一位都是9
if (a[i]>9) {a[i]-=10 a[i+1]+=1 }
}
if (m==length) {length++ a[length-1]=1;}
return *this;
}

bignum bignum::operator + (bignum a2) //实现大数加法运算重载
{
int m,n;
bignum a3("0");
m=(length>a2.length ? length : a2.length);
n=(length<a2.length ? length : a2.length);



1楼2008-12-09 21:38回复
    for (int i=0 i<n i++) //循环每一位相加
    {
    a3.a[i]=a2.a[i] + a[i];
    }
    if (length>a2.length)
    {
    for (i=n i < m; i++){ a3.a[i]=a[i]; };
    }
    else
    {
    for (i=n i < m; i++){ a3.a[i]=a2.a[i]; };
    }
    a3.length=m;
    if (a3.a[m-1]>9) a3.length+=1; //确认应该返回的位数
    for (i=0 i<a3.length i++) //循环检查是否需要进位
    {
    if (a3.a[i]>9) {a3.a[i]-=10 a3.a[i+1]+=1 }
    };
    return a3;
    }



    bignum bignum::operator - (bignum a2)
    {
    int m,n;
    bignum a3("0");
    m=(length>a2.length ? length : a2.length); //较大的位数
    n=(length<a2.length ? length : a2.length); //较小的位数
    for (int i=0 i<n i++) //循环每一位相减
    {
    a3.a[i]=a[i] - a2.a[i];
    }
    if (length>a2.length)
    {
    for (i=n i < m; i++){ a3.a[i] = a[i]; };
    }
    else
    {
    for (i=n i < m; i++){ a3.a[i] = -a2.a[i]; };
    }
    a3.length=m;
    if (a3.a[a3.length-1]<0) {a3.length+=1 a3.a[a3.length-1]=0;}
    for (i=0 i< a3.length-1 i++) //循环检查是否需要退位
    {
    if (a3.a[i]<0) {a3.a[i]+=10 a3.a[i+1]-=1 }
    }
    return a3;
    }

    int main(){
    bignum a1("12345678"),a2("87654321"); //定义两个大数类
    a1.display(); a2.display();
    cout<<endl;
    bignum a3("0"); //定义另一个大数类

    (a1+a2).display(); //实现加法运算重载
    a3=a1+a2;
    a3.display(); //检验

    cout<<endl;
    (a1-a2).display(); //实现减法运算重载
    a3=a1-a2;
    a3.display(); //检验
    cout<<endl;

    a2++; //后置自加运算
    a2.display(); //检验是否自加

    ++a1; //前置自加运算
    a1.display(); //检验

    returnZ
    }


    


    2楼2008-12-09 21:38
    回复
      2025-09-03 12:37:31
      广告
      不感兴趣
      开通SVIP免广告
      ,,







      ╮( ̄▽ ̄)╭

      至少现在微笑着。

      Yes Your Majesty,All Hail Lelouch!!! 


      4楼2008-12-09 22:00
      回复
        嗯……
        继续努力


        IP属地:吉林5楼2008-12-09 23:45
        回复
          晕倒.
          大叔..你每天都编程啊..不累啊..?
          (晕到太平洋底)


          6楼2008-12-10 12:50
          回复