6-1 大整数求和(运算符重载) (20分)(非常好理解的算法)

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

重载面向BigInt类对象的运算符:
‘>>’
<<
+

裁判测试程序样例:
#include
#include
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

#include<string.h>
class BigInt {
    //因为是100位以内的数进行运算,故应选择字符串来进行操作100
    char bigint[100];
public:
    BigInt() {}
    BigInt(char * b) {
        strcpy(bigint, b);
    }
    //采用友元函数来重载<<,>>,+
    //采用传递形参使效率更高
    //返回ostream的引用使得<<能够在一个式子中连续使用<<
    //否则主函数中只能cout<<b;而不能cout<<a<<b;
    //重载>>同理
    friend ostream& operator <<(ostream& os, BigInt& b);
    friend istream& operator >>(istream& is, BigInt& b);
    friend BigInt operator +(BigInt& b1, BigInt& b2);
};
//重载<<运算符 
ostream& operator <<(ostream& os, BigInt& b) {
    os << b.bigint;
    return os;
}
//重载>>运算符 
istream& operator >>(istream& is, BigInt& b) {
    is >> b.bigint;
    return is;
}
//重载+运算符 
BigInt operator +(BigInt& b1, BigInt& b2) {
    /*由于主函数中执行完加法后还需要用到b1,b2中的数据成员,
    故在该函数中另外创建两个string副本来进行操作*/
    char a[100], b[100], sum[101] = {'0'};
    char t;
    int i, size_a, size_b, jin = 0;
    //保证a>=b
    if (strlen(b1.bigint)>=strlen(b2.bigint)) {
        strcpy(a, b1.bigint); strcpy(b, b2.bigint);
    }
    else {
        strcpy(a, b2.bigint); strcpy(b, b1.bigint);
    }size_a =strlen(a) ; size_b = strlen(b);
    //为了方便进位,将a,b倒着存; 
    for (i = 0; i < size_a / 2; i++) {
        t = a[i]; a[i] = a[size_a - 1 - i]; a[size_a - 1 - i] = t;
    }
    for (i = 0; i < size_b / 2; i++) {
        t = b[i]; b[i] = b[size_b - 1 - i]; b[size_b - 1 - i] = t;
    }
    for (i = 0; i < size_a; i++)//循环到最大数的位数+1,不排除最后一位进位
    {
        if(i<size_b)
        	sum[i] = (a[i] + b[i] - '0'+ jin);
        else
        	sum[i] = a[i] + jin;
        jin = 0;
        //'3'=1+2+'0'='1'-'0'+'2'-'0'+'0';
        if (sum[i] > '9') //进位
        {
            jin = 1;
            sum[i] = (sum[i] - '0') % 10 + '0';
        }
    }
	if(jin==1)
    	sum[i++]='1';
    sum[i]='\0';
  //倒着存完再倒过来一遍才能正常输出
    int size_sum = strlen(sum);
    for (i = 0; i < size_sum / 2; i++) {
        t = sum[i]; sum[i] = sum[size_sum - i - 1];
        sum[size_sum - i - 1] = t;
    }
    BigInt bi(sum);
    return bi;
}



这个题涉及知识点多,并且对基本的算法有着考察。
最开始我在BigInt中的数据成员本来是声明为string类型的,查到了关于如何取string里的字符,可以采用自带函数at(),或者迭代器,其次string类也重载了[ ],故也可以像字符数组一样使用。但是后面不知道是什么原因编译一直报错我干脆就换成了char*类型
这个题考查很基本的一点就是,通过字符来进行进位操作的算法,剩下的关于运算符重载的也都很简单,遵守语法规则即可。

By Suki

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值