当前位置:首页 > 题库 > 正文内容

6-1 大整数求和(运算符重载) (15 分)

Luz1年前 (2021-03-08)题库1377
6-1 大整数求和(运算符重载) (15 分)

BigInt类表示不超过100位的无符号大整数。试重载>>,<<和+,以支持无符号大整数的输入、输出与求和(假设结果仍是一个不超过100位的无符号大整数)。

重载面向BigInt类对象的运算符:

>>
<<
+

裁判测试程序样例:

#include <iostream>#include <string>using namespace std;/* 请在这里填写答案 */int main(){
   BigInt a, b, c;    cin>>a>>b;
  c=a+b;    cout<<a<<"+"<<b<<"="<<c<<endl;    return 0;
}

输入样例:

123456789
987654321

输出样例:

123456789+987654321=1111111110
作者
何振峰
单位
福州大学
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
class BigInt
{
public:
    string str;
    BigInt() {}
    BigInt(string s)
    {
        str=s;
    }
 
    friend ostream&operator<<(ostream &os, BigInt &bigint)
    {
        os<<bigint.str;
        return os;
    }
    friend istream&operator>>(istream &is,BigInt &bigint)
    {
        is>>bigint.str;
        return is;
    }
    friend BigInt operator+( BigInt &bigint1, BigInt &bigint2);
};
 
BigInt operator+( BigInt &bigint1, BigInt &bigint2)
{
    string a=bigint1.str;
    string b=bigint2.str;
    string temp;
    if(a.size()>b.size())
    {
        temp=a;
        a=b;
        b=temp;
    }
 
    char *sum=new char[b.size()+2];
    int carry=0;
    int count=0;
    int m,n,k;
    int al,bl;
    for (al=a.size()-1,bl=b.size()-1; al>=0; al--,bl--)
    {
        m=a[al]-'0';
        n=b[bl]-'0';
        k=m+n+carry;
        if(k > 9)
        {
            carry=1;
            k-=10;
            sum[count]=k+'0';
        }
        else
        {
            sum[count]=k+'0';
            carry=0;
        }
        count++;
    }
    if(a.size()==b.size() && carry==1) sum[count]='1';
    if(a.size()==b.size() && carry==0)  count--;
 
    int sizeDif=b.size()-a.size();
    int i=sizeDif-1;
    for(bl!=0; i>=0; i--)
    {
        k=b[i]-'0'+carry;
        if(k>9)
        {
            carry=1;
            k-=10;
            sum[count]=k+'0';
 
        }
        else
        {
            sum[count]=k+'0';
            carry=0;
        }
        count++;
        if(i==0 && carry==1) sum[count]='1';
        if(i==0 && carry==0) count--;
    }
    sum[count+1]='\0';
    int j;
    char t;
    int x=count;
    for(j=0; j<=count/2; j++)
    {
 
        t=sum[j];
        sum[j]=sum[x];
        sum[x]=t;
        x--;
    }
    string st(sum);
    return BigInt(st);
}


相关文章

对于顺序存储的长度为$$N$$的线性表,访问结点和增加结点的时间复杂度分别对应为$$O(1)$$和$$O(N)$$。

对于顺序存储的长度为$$N$$的线性表,访问结点和增加结点的时间复杂度分别对应为$$O(1)$$和$$O(N)$$。 ~@[](1)答案:TRUE...

结构体类型本身不占用内存空间,结构体变量占用内存空间。

结构体类型本身不占用内存空间,结构体变量占用内存空间。 ~@[](1)答案:TRUE...

下面这段代码,用`%d`格式打印输出`double`型变量,将会进行取整,输出为`3`。

下面这段代码,用`%d`格式打印输出`double`型变量,将会进行取整,输出为`3`。 ~@[](2) ``` #include int main(){ double pi = 3.14159; printf("%d"...

语句b = 1,2,3有语法错误。

语句b = 1,2,3有语法错误。 ~@[](2)答案:FALSE...

【真实案例】期末考试交一篇论文,某学生选取某知名企业为研究对象。他查看了该企业主页上的人物介绍并直接拷贝到论文中。这种行为属于抄

【真实案例】期末考试交一篇论文,某学生选取某知名企业为研究对象。他查看了该企业主页上的人物介绍并直接拷贝到论文中。这种行为属于抄袭,判考试作弊。 【Real Case】For a final project, a student chos...

学生须携带照片清晰的身份证或学生证于考试开始前10分钟到达考场。

学生须携带照片清晰的身份证或学生证于考试开始前10分钟到达考场。 Students are required to bring a legible citizenship ID card / passport or their stude...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。